2011-09-13 21 views
6

Tôi có thể dựa vào GUID trong .Net bao nhiêu? SA của tôi nói với tôi rằngTôi có thể dựa vào GUID trong .Net bao nhiêu?

chúng tôi sẽ sử dụng GUID làm khóa chính trong tất cả các bảng.

Tôi tự hỏi độ tin cậy của GUID là khóa chính.

Có thể có cơ hội nào trùng lặp không?

Chúng ta có thực sự sử dụng cách này không?

Hiệu suất hoạt động như thế nào?

Bất kỳ lời khuyên nào cũng hữu ích cho tôi.

+0

http://en.wikipedia.org/wiki/Globally_unique_identifier – Jon

+0

Đây là hướng dẫn: '777 .... 777'; và đây là một thứ khác: '777 ... 777' - vì vậy có, có thể có bản sao, nhưng nó phụ thuộc vào cách bạn tạo ra *** chúng; giả sử bạn đang sử dụng 'NEWID()' hoặc 'Guid.NewGuid()' bạn nên ổn. –

+0

Tôi muốn thấy một câu trả lời mà nói về nhân rộng (ít nhất là một sang một bên) - không sử dụng một GUID như một PK làm cho điều này dễ dàng hơn/khó khăn hơn/không quan tâm? –

Trả lời

6

Đây là một số điểm cho GUID mà cung cấp cho bạn trả lời

Ưu điểm:

  1. độc đáo trên máy chủ.

Nhược điểm:

  1. giá trị chuỗi không phải là tối ưu như các giá trị nguyên cho hiệu suất khi sử dụng trong tham gia, chỉ số và điều kiện.
  2. Không gian lưu trữ lớn hơn INT.

Bạn có thể đọc bài đầy đủ aobut này tại địa chỉ: SQL SERVER – GUID vs INT – Your Opinion

+0

"GUID đồng bằng" tốt hơn một chút đối với các chỉ mục do phân mảnh. (Do đó tại sao SQL Server hỗ trợ * tuần tự * GUID thế hệ ... mà cũng làm giảm miền GUID của trường hợp máy chủ nhất định, tôi tin rằng không phải là nó apt được hết bởi bất kỳ phương tiện ;-) –

+0

@pst - cảm ơn thông tin tôi không có ý tưởng bout nó cho tôi kiểm tra –

+1

[NEWSEQUENTIALID] (http://msdn.microsoft.com/en-us/library/ms189786.aspx) so với [NEWID] (http://msdn.microsoft.com/ en-us/library/ms190348.aspx) ... Hmm. Nó chỉ tăng kể từ khi * cửa sổ được khởi động lại *. Không biết rằng: -/ –

2

Đối với hầu hết các phần, bạn có thể cho rằng họ sẽ không bao giờ lặp lại, Nếu ID của bạn trong một bảng được thiết lập để trở thành Primary Key, sau đó chèn một bản sao sẽ lỗi.

Một lợi thế là sử dụng các ID trong một ứng dụng web là người dùng không thể chỉ kiểm tra URL với ID khác để về mặt lý thuyết sẽ bemore an toàn (mặc dù bạn nên có máy chủ xác nhận cho phép anyway)

4

Có, có thể có một bản sao nhưng nó sẽ không. GUID dài 32 char và mỗi char có thể là 0-F (hệ thập lục phân). Điều đó có nghĩa là 16^32 khả năng.

Vì vậy, nếu bạn tạo 1 000 000 GUIDs mỗi giây trong 10 năm, cơ hội mà bạn tạo ra một bản sao là khoảng 1/1079028307080601418897053.

Theo tôi một GUID là một ứng cử viên khóa chính rất tốt như bạn có thể tạo ra nếu từ bất cứ nơi nào mà không kiểm tra đầu tiên nếu nó đã tồn tại trong cơ sở dữ liệu.

+1

điểm nhỏ: xác suất xác suất sai ở đây. Bạn đã từng nghe về nghịch lý sinh nhật chưa? :) –

+1

Và xin vui lòng, không đo GUID trong ký tự! Chúng dài 128 bit, không dài 32 0-F. Tôi biết nó giống nhau, nhưng nó không giống nhau. Nó giống như nếu tôi đo chiều cao của bạn bằng cách sử dụng đôi chân của tôi .... Wooops :-) – xanatos

+0

@xanatos - Đồng ý với bạn ở đó. Có lẽ không phải là cách tốt nhất để giải thích nó vì nó thực sự làm cho nó âm thanh như GUID là trong thực tế, một chuỗi. Nhưng nó làm cho toán học dễ hiểu hơn một chút;) –

3

Nhờ vào số Birthday Paradox (Problem) bạn có khoảng 50% tìm kiếm trùng lặp nếu bạn tạo 2^64 GUID ... Bạn có hài lòng không? (điều này là bởi vì một GUID hoàn toàn ngẫu nhiên dài 128 bit, do đó, có 2^128 GUID khác nhau. Các nghịch lý sinh nhật cho chúng ta biết rằng nếu bạn có aproximatevely sqrt (2^128) GUID bạn có 50% cơ hội của một vụ va chạm tôi nói hoàn toàn ngẫu nhiên GUID vì có một số loại tiêu chuẩn GUID, nơi một số chữ số được cố định.NET không sử dụng các tiêu chuẩn này (đọc ở đây http://en.wikipedia.org/wiki/Globally_unique_identifier))

Tôi sẽ thêm rằng nếu bạn vấn đề là một vấn đề về "tốc độ" của db, bạn nên đọc này:

Improving performance of cluster index GUID primary key

+0

50%? Thực sự muốn biết làm thế nào bạn đi đến kết luận đó. Làm thế nào bạn tính toán? –

+0

@ Øyvind Nó được giải thích trong wiki. Nó rất vui. Tham gia một lớp học gồm 23 người và có 50% hai người sẽ chia sẻ cùng một ngày sinh. Trong khi 23 không phải là sqrt (365), cho số lớn hơn xấp xỉ là khá tốt (và sqrt (2^128) == 2^64, bởi vì (2^64)^2 == 2^(64 * 2) = = 2^128) – xanatos

+0

Nó phụ thuộc. Thuật toán tạo GUID sử dụng địa chỉ MAC để tạo khóa. Nó có thể ảnh hưởng đến xác suất sao chép GUID trên thiết bị phần cứng. –

4

bạn có thể muốn xem xét những bài viết này:

http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html
http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html

Cá nhân tôi sử dụng số nguyên nếu tôi làm không n eed để có các khóa chính là duy nhất trên nhiều bảng và cơ sở dữ liệu. Tôi thấy việc gỡ lỗi đơn giản hơn với 87 hơn 2A734AE4-E0EF-4D77-9F84-51A8365AC5A0.

0

Hướng dẫn có khả năng thống kê rất cao và do đó là ứng cử viên tốt cho khóa chính nếu các hệ thống khác nhau đang tạo ID và tất cả các hệ thống này cần được kết hợp.

Ví dụ: Làm việc theo kiểu chế độ ngoại tuyến và đẩy lùi thay đổi thành db trung tâm.

+0

Xin lỗi, ý của bạn là "không độc nhất" hoặc "có khả năng là duy nhất"? – kevin

+0

xin lỗi - vâng. đặc biệt không được nhân đôi. – csmith