2009-12-24 37 views
5

Lựa chọn của bạn cho khóa chính trong các bảng đại diện cho một người (như Khách hàng, Người dùng, Khách hàng, Nhân viên, v.v.) là gì? Lựa chọn đầu tiên của tôi sẽ là số SSN. Tuy nhiên, việc sử dụng SSN đã không được khuyến khích vì lo ngại về quyền riêng tư và các quy định khác nhau. SSN có thể thay đổi trong suốt cuộc đời của người, vì vậy đó là một lý do khác chống lại nó.Lựa chọn tốt nhất cho khóa chính của bảng Person

Tôi đoán rằng một trong các chức năng của khóa chính tự nhiên được chọn là tránh trùng lặp. Tôi không muốn một người được đăng ký hai lần trong cơ sở dữ liệu. Một số khóa thay thế hoặc tạo ra khóa chính không giúp tránh các mục trùng lặp. Cách tốt nhất để tiếp cận điều này là gì?

EDIT:

cách tốt nhất để đảm bảo tính độc đáo trong ứng dụng của mình cho người tổ chức là gì và điều này có thể được xử lý trên mức cơ sở dữ liệu với khóa chính hoặc hạn chế tính độc đáo?

+0

Trong Oracle PL/SQL cung cấp cho bạn khả năng duy trì mức độ độc đáo của cơ sở dữ liệu vì bạn có thể viết mã sql để thao tác logic nghiệp vụ. Trong thực tế tất cả các phương ngữ T-SQL khác cung cấp cho bạn sức mạnh đó theo như tôi biết. Tuy nhiên đây không phải là hành vi tiêu chuẩn cho tất cả các động cơ sql. Tính duy nhất có vẻ là một vấn đề logic kinh doanh trong các yêu cầu của bạn. Vì vậy, đi cho nó trong ứng dụng. – user114285

Trả lời

3

Như đã đề cập ở trên, sử dụng tự động tăng làm khóa chính của bạn. Nhưng tôi không tin đây là câu hỏi thực sự của bạn.

Câu hỏi thực sự của bạn là cách tránh các mục trùng lặp. Về lý thuyết, không có cách nào - 2 người có thể được sinh ra trong cùng một ngày, cùng tên, và sống trong cùng một hộ gia đình, và không có số bảo hiểm xã hội có sẵn cho người này hoặc người kia. (Một người có thể là một người nước ngoài đến thăm đất nước).

Tuy nhiên, việc kết hợp tên đầy đủ, ngày sinh, địa chỉ và số điện thoại thường đủ để tránh trùng lặp. Lưu ý rằng các địa chỉ có thể được nhập khác nhau, mọi người có thể có nhiều số điện thoại và mọi người có thể chọn bỏ qua tên đệm của họ hoặc sử dụng tên đệm ban đầu. Nó phụ thuộc vào tầm quan trọng của việc tránh các mục trùng lặp và mức độ lớn của cơ sở người dùng của bạn (và do đó khả năng xảy ra xung đột).

Tất nhiên, nếu bạn có thể nhận được SSN/SIN thì hãy sử dụng để xác định tính duy nhất.

7

Tôi không biết bạn đang sử dụng công cụ cơ sở dữ liệu nào, nhưng (ít nhất với MySQL - xem 7.4.1. Make Your Data as Small as Possible), sử dụng số nguyên, ngắn nhất có thể, thường được coi là tốt nhất cho các yêu cầu về biểu diễn và bộ nhớ.

Tôi sẽ sử dụng số nguyên, auto_increment, cho khóa chính đó.
Ý tưởng hạnh phúc:

  • Nếu PK là ngắn, nó giúp xác định mỗi hàng (đó là nhanh hơn và dễ dàng hơn để so sánh hai số nguyên hơn hai chuỗi dài)
  • Nếu một cột được sử dụng trong các phím nước ngoài là ngắn, nó sẽ yêu cầu ít bộ nhớ hơn cho các khóa ngoài, vì giá trị của cột đó có thể được lưu trữ ở một vài nơi.

Và sau đó, đặt chỉ mục UNIQUE trên cột khác - cột xác định tính đơn nhất - nếu điều đó có thể và/hoặc cần thiết.


Chỉnh sửa: Dưới đây là một vài câu hỏi/câu trả lời khác mà có thể bạn quan tâm:

+0

Cột đó sẽ là gì và bạn có thể đảm bảo tính duy nhất của thực thể đối với cấp cơ sở dữ liệu không? – Dan

+3

Điều gì làm cho một người độc đáo là một câu hỏi phức tạp hơn: không phải tên, không phải địa chỉ, không phải ngày sinh, không ... ;; Có lẽ một combinaison của một số trong những người? Giống như firstname + tên đệm (không biết cách gọi những tên này bằng tiếng Anh) + lastname + birthdate + nơi sinh + giới tính ;; những người thường là những người được sử dụng trên các hình thức "hành chính", ở đây, và nên không quá xấu, tôi giả sử? –

+0

@dan thời gian duy nhất bảo đảm bị hỏng là nếu bạn có nhiều máy chủ cơ sở dữ liệu vật lý và không có logic ứng dụng chính xác (hoặc nhân rộng) để giữ cho người được đồng bộ hóa. Đối với điều này bạn cần phải cung cấp cho logic để giữ cho người-id một toàn cầu duy nhất (lưu ý: Tôi không ngụ ý bạn nên GUID's) –

1

Sử dụng một một khóa chính nguyên nguyên chưa được tạo, và sau đó đặt một ràng buộc duy nhất vào bất kỳ thứ gì mà bạn tin là duy nhất. Nhưng SSN là không phải là duy nhất trong thế giới thực vì vậy sẽ là một ý tưởng tồi để đặt một ràng buộc duy nhất trên cột này trừ khi bạn nghĩ rằng quay đi khách hàng vì cơ sở dữ liệu của bạn sẽ không chấp nhận chúng là một mô hình kinh doanh tốt.

0

Để thêm vào @Mark và @Pascal (số nguyên tự động là cược tốt nhất của bạn) - SSN rất hữu ích và phải được mô hình chính xác. Mối quan tâm về bảo mật là một phần của logic ứng dụng. Bạn có thể bình thường hóa chúng thành một bảng riêng biệt và bạn có thể làm cho chúng độc đáo bằng cách cung cấp trường ngày tháng.

p.s., đối với những người không đồng ý với điểm 'bảo mật trong ứng dụng', DB doanh nghiệp sẽ có mô hình ACL chi tiết; vì vậy đây sẽ không phải là một điểm gắn bó.

1

Tôi thích các khóa tự nhiên, nhưng một bảng person là trường hợp bị mất. SSN không phải là duy nhất và không phải ai cũng có.

1

Tôi muốn giới thiệu khóa thay thế. Thêm tất cả các chỉ mục bạn cần cho các khóa ứng cử viên khác, nhưng việc duy trì logic nghiệp vụ là chìa khóa của tôi.

3

Thuộc tính nào có sẵn cho bạn? Ứng dụng của bạn quan tâm đến ứng dụng nào? Ví dụ, không có hai người có thể được sinh ra tại chính xác cùng một giây tại cùng một vị trí chính xác, nhưng bạn có thể không có quyền truy cập vào dữ liệu đó ở mức độ chính xác đó! Vì vậy, bạn cần phải quyết định, từ các thuộc tính mà bạn dự định mô hình hóa, cái nào là đủ để cung cấp mức độ toàn vẹn dữ liệu có thể chấp nhận được. Bất cứ điều gì bạn chọn, bạn phải tập trung vào các khía cạnh toàn vẹn dữ liệu (ngăn chặn chèn nhiều hàng cho cùng một người) của lựa chọn của bạn.

Để tham gia/Khóa ngoại trong các bảng khác, tốt nhất nên sử dụng khóa thay thế.

Tôi đã phát triển để xem xét việc sử dụng từ Khoá chính làm từ khóa sai hoặc tốt nhất, gây nhầm lẫn. Phím bất kỳ, cho dù bạn cờ nó như Primary Key, thay thế chính, Unique chính, hoặc Index Unique, vẫn là một Key, và yêu cầu mọi hàng trong bảng chứa các giá trị duy nhất cho các thuộc tính trong Chìa khóa. Theo nghĩa đó, tất cả các phím đều tương đương nhau. Điều quan trọng hơn (Hầu hết), là liệu chúng có phải là khóa tự nhiên (phụ thuộc vào thuộc tính dữ liệu mô hình miền thực) hay thay thế (Độc lập của thuộc tính dữ liệu thực)

Thứ hai, điều gì cũng quan trọng là bạn sử dụng khóa Các khóa thay thế là hẹp và đơn giản và không bao giờ thay đổi (Không có lý do gì - chúng không có ý nghĩa gì cả) Vì vậy, chúng là một lựa chọn tốt hơn cho việc tham gia hoặc cho các khóa ngoài trong các bảng phụ thuộc khác.

Nhưng để đảm bảo tính toàn vẹn dữ liệu và ngăn chèn nhiều hàng cho cùng một thực thể tên miền, chúng hoàn toàn vô dụng ... Vì bạn cần một số loại khóa tự nhiên, được chọn từ dữ liệu bạn có sẵn và mà ứng dụng của bạn đang lập mô hình cho một số mục đích.

Khóa không phải là 100% không thay đổi. Nếu (ví dụ), bạn sử dụng Tên và Số điện thoại và Ngày sinh, ví dụ, ngay cả khi một người thay đổi tên của họ hoặc số điện thoại của họ, bạn có thể chỉ cần thay đổi giá trị trong bảng. Miễn là không có hàng nào khác đã có các giá trị mới trong thuộc tính khóa của chúng, bạn vẫn ổn.

Ngay cả khi khóa bạn chọn chỉ hoạt động trong 99,9% trường hợp, (giả sử bạn đủ may mắn để chạy vào hai người có cùng tên và số điện thoại và được sinh ngẫu nhiên cùng ngày), ít nhất, ít nhất 99,9% dữ liệu của bạn sẽ được đảm bảo chính xác và nhất quán - và bạn có thể làm ví dụ, chỉ cần thêm thời gian vào ngày sinh của họ để làm cho chúng độc đáo hoặc thêm một số thuộc tính khác vào khóa để từ bỏ chúng. Miễn là bạn không phải cập nhật các giá trị dữ liệu trong Khóa Ngoại trong toàn bộ cơ sở dữ liệu của bạn do thay đổi, (vì bạn không sử dụng khóa này làm FK ở nơi khác), bạn không gặp phải bất kỳ vấn đề nào đáng kể.

1

Tôi thích các khóa tự nhiên, khi chúng có thể được tin cậy.

Trừ khi bạn đang điều hành ngân hàng hoặc đại loại như vậy, không có lý do gì để khách hàng và người dùng của bạn cung cấp cho bạn một SSN hợp lệ hoặc thậm chí nhất thiết phải có một SSN. Vì vậy, vì lý do kinh doanh, bạn buộc phải không tin tưởng SSN trong trường hợp bạn phác thảo. Một người lập luận tương tự sẽ giữ bất kỳ chìa khóa tự nhiên nào cho "người".

Bạn không có lựa chọn nào ngoài việc chỉ định khóa nhân tạo (Đọc "thay thế"). Nó cũng có thể là một số nguyên. Hãy chắc chắn rằng nó là số nguyên đủ lớn, do đó bạn sẽ không cần phải mở rộng nó thật sớm.

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