7

Tôi nhận thấy câu hỏi này rất có thể đã được hỏi trước đây, nhưng tôi đã tìm kiếm xung quanh một chút trong số các câu hỏi về StackOverflow và tôi không thực sự tìm thấy câu trả lời cho tôi, vì vậy, ở đây. Nếu bạn tìm thấy một bản sao, xin vui lòng liên kết với nó.Loại dữ liệu nào được đề xuất cho cột ID?

Vì lý do nào đó, tôi thích sử dụng Guid s (uniqueidentifier trong MsSql) cho các trường khóa chính của mình, nhưng tôi thực sự không biết tại sao điều này sẽ tốt hơn. Trong nhiều hướng dẫn tôi đã tự mình trải qua gần đây một số tự động tăng lên int đã được sử dụng. Tôi có thể thấy pro và khuyết điểm với cả hai:

  • Một Guid luôn là kích thước và chiều dài giống nhau, và không có lý do để lo lắng về việc hết họ, trong khi có một giới hạn bao nhiêu hồ sơ bạn có thể có trước khi bạn hết số điện thoại phù hợp với số int.
  • int là (ít nhất là trong C#) một loại có thể vô hiệu hóa, mở ra cho một vài phím tắt khi truy vấn dữ liệu.
  • int dễ đọc hơn.
  • Tôi đặt cược bạn có thể đưa ra ít nhất một vài thứ ở đây.

Vì vậy, đơn giản như tiêu đề cho biết: Loại dữ liệu được đề xuất cho cột ID (khóa chính) trong cơ sở dữ liệu là gì?

EDIT: Sau khi nhận được một vài câu trả lời ngắn, tôi cũng phải thêm câu hỏi tiếp theo này. Nếu không có câu trả lời đó, câu trả lời của bạn không hấp dẫn và không giáo dục ...;) Tại sao bạn nghĩ vậy và điểm yếu của tùy chọn khác khiến bạn không phải là nên chọn thay thế?

+0

cần được chỉ ra rằng GUID và số nguyên chỉ là các cách hiển thị và tạo chuỗi byte khác nhau. Trường hợp int được tạo tuần tự, GUID được tạo "ngẫu nhiên" và có nhiều byte hơn trong đó. điều đó có nghĩa là bạn không cần phải xem trạng thái hiện tại của cơ sở dữ liệu để tạo một cơ sở dữ liệu. mọi thứ có thể được vô hiệu hóa trong C# bằng một? trên đó. –

Trả lời

8

Bất kỳ loại số nguyên nào đủ kích thước để lưu trữ phạm vi dữ liệu dự đoán. Nói chung 32 bit int được xem là quá nhỏ (đúng hay sai) đối với các bảng có nhiều hàng hoặc thay đổi. Một int 64 bit là rất nhiều. Nhiều cơ sở dữ liệu sẽ không có hoặc sẽ không sử dụng loại số nguyên đó nhưng sẽ sử dụng loại NUMBER có quy mô và độ chính xác được chỉ định. 10-15 chữ số là một kích thước khá phổ biến.

Lý do cho việc lựa chọn các loại nguyên gồm hai phần:

  1. Kích; và
  2. Tốc độ.

Kích thước của một số nguyên là:

  • 32 bit: 4 byte;
  • 64 bit: 8 byte;
  • Số thập phân được mã hóa nhị phân: hai chữ số trên mỗi byte cộng với số byte cho dấu, tỷ lệ và/hoặc độ chính xác.

So sánh với GUID, là 128 bit hoặc chuỗi bình thường, ít nhất một byte cho mỗi ký tự (nhiều mã hóa ký tự nhất định) cộng với phí trên có thể ít nhất một byte) hoặc có thể nhiều hơn trong một số trường hợp.

Phân loại số nguyên là tầm thường và giả sử chúng là duy nhất và phạm vi đủ nhỏ, thực sự có thể được thực hiện trong thời gian O (n), so với, tốt nhất là O (n log n).

cũng quan trọng, hầu hết các cơ sở dữ liệu có thể tạo ID duy nhất bằng các cột và/hoặc chuỗi tự động tăng. Việc đảm bảo tính duy nhất trong một ứng dụng là thực sự khá khó khăn và có xu hướng dẫn đến các phím cồng kềnh.

Cộng với các phím số nguyên được tạo tự động thường được đặt hàng lỏng lẻo hoặc hoàn toàn (tùy thuộc vào cơ sở dữ liệu và cấu hình), đây là một chất lượng hữu ích. GUIDs được tạo ngẫu nhiên về cơ bản không có thứ tự, điều này ít hữu ích hơn nhiều.

+0

Cảm ơn bạn đã trả lời! Xem chỉnh sửa của tôi cho câu hỏi tiếp theo. –

1

Nếu bạn sử dụng một thời gian dài, bạn có thể tạo hơn 1000 giây và không chạy hết khóa chính trong 29 triệu năm.

Những người khác đã đề cập đến một số lợi thế của việc sử dụng loại số nguyên thay vì UUID/GUID. Một trong những lợi thế lớn là tốc độ và độ chặt của các chỉ mục. Một ứng dụng gần đây tôi đã tham gia vào nơi tôi đã thiết kế cơ sở dữ liệu, tôi cần UUID, nhưng không muốn từ bỏ những lợi thế của việc sử dụng thời gian cho khóa chính, vì vậy tôi đã có một bảng "allIds" được ánh xạ mọi khóa chính trong hệ thống thành UUID. Tất cả các khóa chính của tôi được tạo ra từ một chuỗi duy nhất, vì vậy tất cả chúng đều độc đáo trên tất cả các bảng.

+0

Cảm ơn bạn đã trả lời! Xem chỉnh sửa của tôi cho câu hỏi tiếp theo. –

5

Cơ sở dữ liệu phổ biến cho phép các trường tự động hóa lớn hơn trong nhiều năm nay, do đó, vấn đề này ít hơn nhiều.

Đối với những gì cần sử dụng, nó luôn là lựa chọn. Một là không rõ ràng tốt hơn hơn khác, họ có đặc điểm khác nhau và mỗi là tốt trong các kịch bản khác nhau. Tôi đã sử dụng cả hai theo thời gian, và lược đồ tiếp theo tôi làm việc với tôi sẽ xem xét cả hai.

Ưu điểm cho GUID:

  • nên là duy nhất trên máy tính.
  • Goo ngẫu nhiên, không đáng yêu có nghĩa là mọi người có khả năng sử dụng chỉ này chỉ cho mục đích định nghĩa của một số nhận dạng mờ đục.

Ưu điểm cho autoincrement:

  • Nhân dễ hiểu.
  • Phân công tuần tự có nghĩa là bạn có thể sử dụng chỉ mục nhóm và hiệu suất tác động.
  • Thích hợp cho phân vùng dữ liệu.
5

Một bất lợi lớn khi sử dụng khóa GUID là rất khó thực hiện các truy vấn "ad-hoc" bằng tay. Đôi khi nó là rất hữu ích mà bạn có thể làm điều này:

SELECT * FROM tài nơi UserID = 452245

Với phím GUID này có thể trở nên rất khó chịu.

Tôi muốn giới thiệu số nguyên 64 bit

+0

Tôi muốn thêm rằng GUID không dễ dàng đọc được, vì vậy nếu tôi gọi hỗ trợ khách hàng với ID giao dịch của tôi, tôi thay vì cung cấp số hơn GUID. Chỉ có máy nên đọc GUID. –

2

Cho tôi biết tiêu chí nào bạn nghĩ là quan trọng.

Số yêu cầu là duy nhất trong bảng.

GUID là định danh duy nhất có xác suất toàn cầu. Nó cũng lớn. Nếu bạn cần các chỉ mục của bạn là duy nhất trong vòng epsilon trên mọi cài đặt cơ sở dữ liệu khác trong vũ trụ, đó là một lựa chọn tốt. Nếu không, nó sử dụng rất nhiều không gian không cần thiết.

Số tự động là tốt; nó nhỏ, và chắc chắn là duy nhất trong bảng. Mặt khác, nó cung cấp cho bạn không có sự bảo vệ chống trùng lặp; hai mục, giống hệt nhau, ngoại trừ số ma thuật, rất dễ tạo.

Sử dụng một số giá trị được gắn với thực thể đang được mô tả tránh điều đó, nhưng bạn có vấn đề đối phó với tính duy nhất.

0

Nếu cơ sở dữ liệu được phân phối, nơi bạn có thể nhận bản ghi từ cơ sở dữ liệu khác, khóa chính cần phải là duy nhất trong một bảng trên tất cả các cơ sở dữ liệu. GUID giải quyết vấn đề này, mặc dù với chi phí không gian. Một sự kết hợp của autoincrement và không gian tên sẽ là một sự cân bằng tốt.

Sẽ thật tuyệt nếu cơ sở dữ liệu có thể cung cấp hỗ trợ inbuild cho autoincrements với "tiền tố". Vì vậy, trong một cơ sở dữ liệu, tôi nhận được ID như X1, X2, X3 ... và vv trong khi trong cơ sở dữ liệu khác nó có thể là Y1, Y2, Y3 ... và như vậy.

+0

Và loại dữ liệu nào bạn cho rằng X1 và Y2 của bạn sẽ là? Dây? Trong trường hợp đó, bạn nên sử dụng GUID ... – Jasper

0

tư vấn Thực hiện theo Cletus của, với caveat thêm của nó phụ thuộc nhiều vào những gì storting của bạn. Không bao giờ, sử dụng GUID. GUID có một loạt các nhược điểm, và chỉ có một hoặc hai upsides.

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