2010-02-09 32 views
12

Tôi đang làm một ứng dụng web trên asp.net mvc và tôi đang chọn giữa loại dữ liệu dài và Guid cho các thực thể của mình, nhưng tôi không Không biết cái nào tốt hơn. Một số người nói rằng dài là nhanh hơn nhiều. Guid cũng có thể có một số lợi thế. Có ai biết không?long vs Guid cho Id (Entity), ưu và nhược điểm là gì

+0

Thực thể .... trong cơ sở dữ liệu? Trong bản đồ băm? –

+1

Thực thể có trong ứng dụng của tôi, Trong cơ sở dữ liệu có các bảng có thể là bigint hoặc uniqueidentifier – Omu

Trả lời

16

Khi GUIDs có thể không phù hợp

GUID được hầu như luôn luôn sẽ chậm hơn, vì họ là lớn hơn. Điều đó làm cho các chỉ số của bạn lớn hơn. Điều đó làm cho các bảng của bạn lớn hơn. Điều đó có nghĩa rằng nếu bạn phải quét các bảng của bạn, toàn bộ hoặc một phần, nó sẽ mất nhiều thời gian hơn và bạn sẽ thấy hiệu suất kém hơn. Đây là một mối quan tâm lớn trong các hệ thống dựa trên báo cáo. Ví dụ, người ta sẽ không bao giờ sử dụng GUID như một khóa ngoại trong bảng thực tế vì độ dài của nó thường là quan trọng, vì các bảng thực tế thường được quét một phần để tạo ra các tập hợp.

Đồng thời xem xét liệu có phù hợp để sử dụng "dài" hay không. Đó là một con số khổng lồ. Bạn chỉ cần nó nếu bạn nghĩ rằng bạn có thể có hơn 2 TRIỆU mục trong bảng của bạn tại một số điểm. Thật hiếm khi tôi sử dụng chúng.

GUID cũng có thể khó sử dụng và gỡ lỗi. Nói, "có vấn đề với hồ sơ Khách hàng 10034, Frank, hãy kiểm tra xem nó" dễ hơn rất nhiều khi nói "có vấn đề với {2f1e4fc0-81fd-11da-9156-00036a0f876a} ..." Ints và longs cũng dễ dàng hơn để nhập vào các truy vấn khi bạn cần.

Ồ, và không phải là trường hợp bạn không bao giờ nhận cùng một GUID hai lần. Nó đã được biết là xảy ra trên rất lớn, hệ thống bị ngắt kết nối, vì vậy đó là một cái gì đó để xem xét, mặc dù tôi sẽ không thiết kế cho nó trong hầu hết các ứng dụng.

Khi GUIDs có thể phù hợp

GUIDs thích hợp khi bạn đang làm việc với các hệ thống bị ngắt kết nối, nơi các đối tượng được tạo ra và sau đó đồng bộ. Ví dụ: nếu ai đó tạo bản ghi trong cơ sở dữ liệu của bạn trên thiết bị di động và đồng bộ hóa hoặc bạn có các thực thể được tạo tại các văn phòng chi nhánh khác nhau và được đồng bộ hóa với cửa hàng trung tâm vào ban đêm. Đó là loại linh hoạt mà họ cung cấp cho bạn.

GUID cũng cho phép bạn kết hợp các thực thể mà không cần lưu giữ chúng vào cơ sở dữ liệu, trong một số trường hợp ORM nhất định. LINQ to SQL (và tôi tin rằng EF) không có vấn đề này, mặc dù có những lúc bạn có thể bị buộc phải gửi các thay đổi của bạn vào cơ sở dữ liệu để lấy chìa khóa.

Nếu bạn tạo GUID của mình trên máy khách, có thể vì GUID bạn tạo không tuần tự, hiệu suất chèn có thể bị ảnh hưởng do phân tách trang trên DB.

Lời khuyên của tôi

Rất nhiều thứ để xem xét ở đây. Bỏ phiếu của tôi là không sử dụng chúng trừ khi bạn có một trường hợp sử dụng thuyết phục cho họ. Nếu hiệu suất thực sự là mục tiêu của bạn, hãy giữ cho bàn của bạn nhỏ. Giữ cho các lĩnh vực của bạn nhỏ. Giữ chỉ số DB của bạn nhỏ và có chọn lọc.

+0

điều này xác nhận lý do tại sao thay đổi từ 'GUID' thành ứng dụng quản lý kích thước công ty thực sự cải thiện hiệu suất trong trường hợp của tôi, cảm ơn bạn đã cung cấp thông tin. tôi có thể xác nhận nó quan trọng hiệu suất khôn ngoan, cũng thers vấn đề nhận được duplicate'GUID's mà tôi gặp phải với nhóm của tôi và didnt biết nguyên nhân tại thời điểm .. vì vậy điều này cũng giải thích tại sao – Niklas

3

SIZE: Long là 8 byte Guid là 16 byte

GUID có chắc chắnkhả năng cao cho sẽ là duy nhất và tốt nhất là nên sử dụng để xác định các hồ sơ cá nhân trong một cơ sở dữ liệu (S).

dài

(Identity trong DB), có thể đại diện cho một kỷ lục độc đáo trong một bảng nhưng bạn có thể có hồ sơ thể hiện bằng cùng một ID (Identity), trong một hay khác nhau nhiều bảng như như sau:

TableA: PersonID int, name varchar(50) 
TableB: ProductID int, name varchar(50) 

SELECT PersonID from TableA where name ='' 
SELECT ProductID from TableB where name ='' 

cả có thể trở lại cùng một giá trị, nhưng trong trường hợp của GUID:

TableA: PersonID uniqueidentifier, name varchar(50) 
TableB: ProductID uniqueidentifier, name varchar(50) 

SELECT PersonID from TableA where name ='' 
SELECT ProductID from TableB where name =' 

bạn hiếm khi có thể có cùng một giá trị như id trở về từ hai bảng

có một cái nhìn ở đây

+1

"GUID chắc chắn sẽ là duy nhất" thực sự là không chính xác (thoiugh cho tất cả các mục đích và mục đích bạn nói đúng) đó là một thuật toán xác suất để tuyên bố sẽ chính xác hơn một cái gì đó như thế này: "GUID là với một xác suất rất cao sẽ là duy nhất" nhưng nó thực sự _not_ đảm bảo (nhưng nguy cơ là gần với nguy cơ bị trúng một thiên thạch) –

+0

@Rune FS: Cảm ơn bạn đời sửa chữa, đã chỉnh sửa cho phù hợp –

2

Guids làm cho nó dễ dàng hơn nhiều để tạo ra một thực thể 'tươi' trong API của bạn bởi vì bạn chỉ đơn giản là gán cho nó giá trị của Guid.NewGuid(). Không có sự phụ thuộc vào các phím tăng tự động từ một cơ sở dữ liệu, vì vậy điều này tốt hơn tách rời Mô hình miền khỏi cơ chế tồn tại cơ bản. Mặt khác, nếu bạn sử dụng Guid làm chỉ số Clustered trong SQL Server, chèn sẽ trở nên đắt đỏ vì các hàng mới rất hiếm khi được thêm vào cuối bảng, vì vậy chỉ số cần được xây dựng lại rất thường xuyên.

Một vấn đề khác là nếu bạn thực hiện các lựa chọn từ cơ sở dữ liệu như vậy mà không chỉ định thứ tự rõ ràng, bạn sẽ nhận được kết quả theo thứ tự cơ bản ngẫu nhiên.

+1

Trình tự tuần tự tránh vấn đề chỉ mục nhóm mà bạn mô tả. Xem http://stackoverflow.com/questions/665417/sequential-guid-in-linq-to-sql –

+0

Id sẽ là Khóa chính, điều đó có nghĩa là nó sẽ tự động là chỉ mục nhóm? – Omu

+0

Trên máy chủ SQL, Khóa chính sẽ là chỉ mục được nhóm theo mặc định, nhưng bạn chỉ định khác. –

Các vấn đề liên quan