Một khóa thay thế có bao giờ được tiếp xúc với người dùng?


14

Thông thường trong một bảng không có khóa tự nhiên, nó vẫn hữu ích cho người dùng để có thể có một định danh được tạo duy nhất. Nếu bảng có khóa chính thay thế (và trong trường hợp như vậy, bạn chắc chắn sẽ mong đợi nó) nếu khóa đó được hiển thị cho người dùng hoặc nên sử dụng trường khác cho mục đích đó?

Một lý do không để lộ khóa thay thế là bây giờ bạn không thể thực hiện các thao tác duy trì mối quan hệ giữa các bản ghi, nhưng thay đổi các giá trị khóa, chẳng hạn như xóa / chèn lại một số loại, nhiều phương pháp sao chép dữ liệu từ một cơ sở dữ liệu sang khác, v.v.

Ưu điểm chính của việc lộ khóa thay thế là sự đơn giản trong việc sử dụng một lĩnh vực mà bạn có.

Trong trường hợp nào thì tốt hơn là để lộ trực tiếp khóa thay thế cho người dùng?


Một phần của câu hỏi này là bạn cần xác định 'người dùng.' Người dùng có thể là người tiêu dùng API mà bạn tiếp xúc hoặc làm thịt người. Câu trả lời sẽ không giống nhau cho cả hai.
James Snell

1
Thịt người.
psr

Mỗi tình huống trong đó dữ liệu có thể được xác định khác nhau nên có một định danh khác nhau. Vì vậy, nếu một hệ thống mới kết nối với dữ liệu của bạn, hãy hy vọng nó có PK riêng và thêm dữ liệu đó vào dữ liệu của bạn. Tầm nhìn về "những chiếc túi xấu xí chủ yếu là nước" được coi là một "hệ thống" cho kịch bản này. Giải pháp ưa thích của tôi là lưu trữ các khóa và dấu thời gian (thêm và thay đổi và xóa) cho các thực thể trong một bảng đặc biệt. Theo cách này, dữ liệu có thể được phân phối dễ dàng.

Câu trả lời:


10

Bạn cần sẵn sàng cho bất kỳ số nhận dạng nào được hiển thị cho người dùng / khách hàng cần được thay đổi và thay đổi danh tính của một hàng trong cơ sở dữ liệu và tuyên truyền thay đổi đó cho tất cả các khóa ngoại chỉ là yêu cầu ngắt dữ liệu.

Nếu dữ liệu không có khóa kinh doanh tự nhiên, bạn có thể thêm một trường bổ sung cho "số nhận dạng doanh nghiệp". Điều này nên được tối ưu hóa cho các quy trình mà nó được sử dụng cho. Nhập bàn phím điện thoại có nghĩa là chỉ số. Qua điện thoại / bằng lời nói có nghĩa là tránh các ký hiệu âm thanh tương tự (B / D, M / N, v.v.). Bạn thậm chí có thể tự động tạo một số cụm từ dễ nhớ ("thạch xanh").

Hiệu quả của việc này là doanh nghiệp sau này có thể thay đổi cách họ muốn tham chiếu đến các bản ghi và thay đổi lược đồ dữ liệu duy nhất là thêm một cột mới cho kiểu id đó hoặc biến đổi các id đã có. Thay đổi không lan truyền trong toàn bộ cơ sở dữ liệu và bạn vẫn có một id (đại diện thay thế) hợp lệ theo thời gian.

Nói tóm lại, tôi sẽ tránh để lộ các khóa thay thế cho người dùng. Như các ý kiến ​​chỉ ra, các khóa thay thế hầu như không bao giờ thay đổi. Ngược lại, các doanh nghiệp muốn thay đổi mọi thứ. Nếu khóa thay thế bị lộ, đó chỉ là vấn đề thời gian trước khi doanh nghiệp muốn thay đổi nó.

Như một lưu ý phụ, khi tôi nói "phơi bày" ở đây, tôi có nghĩa là đưa chìa khóa cho người dùng với mong muốn họ sử dụng nó trực tiếp (như gọi vào để hỗ trợ với số thứ tự của họ).


5
Câu trả lời này không có ý nghĩa. Khóa thay thế không bao giờ thay đổi và bạn chưa tạo ra trường hợp nào không tiết lộ chúng cho người dùng.
Robert Harvey

1
không bao giờ nói không bao giờ. Điều gì nếu thiết kế sau này dẫn đến hợp nhất kỷ lục? Điều gì nếu bạn cần tăng kích thước và chuyển đổi từ danh tính?
DougM

3
@DougM: Sau đó viết các bản ghi vào một bảng tổng hợp mới bằng khóa thay thế riêng của nó và duy trì các khóa gốc trong các trường riêng biệt trong bảng mới (và một trường xác định bảng nguồn gốc) làm tham chiếu, nếu cần. Loại hợp nhất đó là cực kỳ hiếm, và chỉ là kết quả của một thiết kế đã được khắc phục. Lặp lại sau tôi: Surrogate. Chìa khóa. Không bao giờ. Thay đổi. Đó là lý do tại sao họ thay thế.
Robert Harvey

2
@RobertHarvey Tôi đồng ý rằng các khóa thay thế sẽ không bao giờ thay đổi, đó là lý do tại sao tôi nghĩ rằng chúng tạo ra các định danh bên ngoài kém. Cuối cùng, một khách hàng sẽ muốn thay đổi cách họ đề cập đến một bản ghi. Tại thời điểm đó, bạn đã xây dựng toàn bộ hệ thống của mình xung quanh các khóa thay thế bất biến hoặc bạn nghĩ trước và đặt một mức độ không xác định giữa các định danh doanh nghiệp và các khóa thay thế.
Chris Pitman

2
@sqlvogel: Nó sẽ làm mọi thứ rõ ràng hơn nếu tôi sử dụng thuật ngữ "khóa chính do hệ thống tạo" thay vì "thay thế?" Tôi đồng ý rằng bạn có thể muốn thay đổi thuật toán tạo khóa thay thế, nhưng điều đó không làm thay đổi chất lượng cơ bản bất biến của chúng.
Robert Harvey

4

Trong một số trường hợp, các khóa thay thế được mong đợi và có ý nghĩa với người dùng. Ví dụ yêu thích của tôi là "số thứ tự". Số thứ tự không thực sự là khóa tự nhiên: khóa tự nhiên có thể là dấu thời gian cộng với người dùng hoặc có thể nhiều hơn thế nếu bạn mong muốn người dùng tạo nhiều hơn một đơn hàng trong độ chi tiết của dấu thời gian của bạn.

Tuy nhiên, người dùng hiểu và mong đợi sự tiện lợi của số thứ tự. Không có hại, và rất nhiều giá trị, nếu bạn cho người dùng biết về chúng.

Mặt khác, một số phím thay thế không có ý nghĩa với người dùng. Chắc chắn, công ty bảo hiểm sức khỏe của tôi có một số khóa thay thế nhận dạng tôi dựa trên id thành viên, ngày sinh, người vận chuyển, v.v., nhưng tôi không quan tâm đến điều đó, tôi quan tâm đến thông tin trên thẻ của tôi (thường bao gồm id dựa trên về chủ nhân của tôi và không phải là duy nhất trên toàn vũ trụ ... Do đó, khóa thay thế tại công ty bảo hiểm).


Nếu người dùng hiểu nó và mong muốn tương tác với nó, thì đó không còn là khóa thay thế. Khóa thay thế được định nghĩa là không có ý nghĩa kinh doanh. Chỉ vì đó là số ID không nhất thiết có nghĩa là số thay thế. Ngoài ra, "một số khóa thay thế xác định tôi dựa trên id thành viên của tôi, ngày sinh [...]" không có ý nghĩa. Bạn đang nói rằng khóa thay thế của họ (không có ý nghĩa kinh doanh) xác định bạn dựa trên những thứ có thể tạo ra khóa tự nhiên?
Kyle McVay

Thông thường, điều xảy ra là bạn được cấp số id nhân viên để trong hệ thống nhân viên, bạn được phân biệt với những người khác có cùng tên. Trên thẻ bảo hiểm của bạn, nó có thể liệt kê id công ty và nhân viên của bạn. Nhưng công ty bảo hiểm y tế sẽ thường tạo id nội bộ của riêng mình mà công ty có thể sử dụng trên tất cả các hệ thống của mình thay vì sử dụng tên, ngày sinh và id nhân viên mà họ nhận được từ chủ lao động. Là các khóa được tạo thay thế hoặc khóa tự nhiên? Phụ thuộc vào người bạn hỏi (kiểm tra 2 định nghĩa luân phiên tại en.wikipedia.org/wiki/Surrogate_key )
Alan Shutko

1

Bạn chỉ nên để lộ khóa thay thế nếu đó là GUID / UUID được tạo đúng. Hiển thị các khóa thay thế liên tiếp là số 4 trong 10 vấn đề bảo mật hàng đầu của OWASP.

* Trong thực tế, tốt nhất là giả định rằng nó không được tạo đúng cho các mục đích này trừ khi bạn biết rằng nó được tạo bởi một trình tạo số ngẫu nhiên hoặc giả ngẫu nhiên an toàn bằng mật mã.


2
Không rõ câu trả lời của bạn về cách GUID cải thiện bảo mật.
Robert Harvey

1
@RobertHarvey - Tôi giả sử vì chúng không tuần tự và vì vậy không thể đoán được.
Bobson


@RobertHarvey, làm rõ.
Peter Taylor

1

Nếu một bảng không có khóa tự nhiên, các khóa thay thế cho phép các hàng như thế này.

surrogate_key  some_name
--
1              Wibble
2              Wibble
...
17             Wibble
...
235            Wibble

Tôi sẽ gọi những khóa nhân tạo này thay vì khóa thay thế, nhưng sự khác biệt đó không quan trọng đối với câu hỏi này.

Bây giờ, giả sử rằng có dữ liệu quan trọng tham chiếu các khóa thay thế này thông qua khóa ngoại, làm thế nào để người dùng cuối biết hàng nào sẽ cập nhật nếu họ không biết các giá trị khóa thay thế?


Có một chút mâu thuẫn khi gắn nhãn cột "surrogate_key" nhưng sau đó nói rằng chúng là "khóa nhân tạo thay vì khóa thay thế". Nếu bạn gọi các khóa nhân tạo này vì chúng không có ý nghĩa kinh doanh và chỉ đóng vai trò là định danh duy nhất, thì khóa này phải được nhập tịch (lộ) và nên tạo khóa thay thế mới. tức là đổi tên surrogate_key đã nhập tịch thành một cái gì đó có ý nghĩa kinh doanh, đưa nó ra cho khách hàng và tạo một cột tương tự mới để trở thành đại diện thay thế thực sự cho các hoạt động nội bộ. Ít hơn lý tưởng, nhưng vẫn tốt hơn là phơi bày một người thay thế thực sự.
Kyle McVay

@KyleMcVay: Nó không mâu thuẫn. Nó tôn vinh ý nghĩa của việc thay thế , ý tưởng thiết yếu là "thay thế cho". Một khóa thay thế thay thế cho một khóa tự nhiên. (Codd và lý thuyết quan hệ trong công dụng chung phím thay thế theo nghĩa này.) Một bảng đó không có phím tự nhiên không thể một phím thay thế trong ý nghĩa đó. Nhưng nó có thể có một giá trị tùy ý được sử dụng thay vì bất cứ thứ gì khác. Đó là cái mà tôi gọi là khóa nhân tạo.
Mike Sherrill 'Nhớ lại mèo'

Định nghĩa của bạn không chính xác, nhưng tôi nghĩ rằng khóa thay thế đã mang ý nghĩa bổ sung, cụ thể của ngành ngoài từ thay thế . Nếu bạn định đưa ra một chìa khóa cho khách hàng, tôi sẽ lập luận rằng khóa đó bây giờ có ý nghĩa kinh doanh; nó đã được nhập tịch , và bây giờ nên được coi là một phần logic của thực thể mà nó đại diện. Theo logic này, không có thứ gọi là khóa thay thế được phơi bày. Nếu bạn định để lộ khóa nhân tạo, nó không còn là khóa thay thế và bạn cần một khóa mới.
Kyle McVay

0

Theo cách nói của giáo dân:

  • Người thay thế nên được ẩn khỏi người dùng.
  • Bạn nên để lộ một số khóa ứng viên kinh doanh khác cho người dùng.
  • Nếu không có khóa ứng viên nào khác tồn tại, bạn nên hiển thị PK. Nhưng trong trường hợp này, PK không được coi là thay thế vì nó không thay thế cho cột khác.

Tại sao PK phải được hiển thị? Tôi nghĩ đó là câu hỏi của tôi - liệu PK được tạo tự động có được gọi đúng là khóa thay thế hay không là tiếp tuyến.
psr

1
@psr Tiêu đề câu hỏi của bạn cho biết " khóa thay thế từng bị lộ". Tôi nói không. Nhưng bạn phải hiển thị một số chìa khóa khác. Nếu không có khóa nào khác tồn tại thì bạn phải hiển thị khóa duy nhất bạn có. Về mặt thực tế, tôi làm rõ rằng trong những trường hợp đó, khóa không thực sự thay thế bởi vì nó không thay thế cho bất kỳ cột nào khác.
Tulains Córdova

Câu hỏi là liệu bạn nên thêm một cột, hoặc hiển thị khóa bạn có.
psr

@psr Tôi đặt lại câu trả lời của mình để làm cho nó rõ ràng hơn.
Tulains Córdova

1
Tôi thấy đó là một sự khác biệt không đáng kể về mặt vật chất. Nếu quy tắc của bạn là mọi bảng đều có khóa nhân tạo (đó là của tôi) và chỉ có các khóa nhân tạo tham gia (đó cũng là nguyên tắc của tôi), thì khái niệm rằng một khóa là thay thế bởi vì các khóa khác có thể là có sẵn là không quan trọng.
Robert Harvey

0

bạn CHỈ nên hiển thị một trường cho người dùng cung cấp thông tin hữu ích cho người dùng, trực tiếp hoặc báo cáo lỗi cho bạn.

ngược lại, bạn LUÔN LUÔN phơi bày "thay thế khóa chính" khi chúng là phương tiện chính để xác định một bản ghi (đơn giản hoặc phức tạp) cho tương tác mà người dùng thực hiện.


0

Không quan trọng bạn có để lộ chìa khóa hay không cho người dùng cuối. Ứng dụng của bạn nên thực hiện ủy quyền cần thiết sao cho chỉ cần biết id đơn hàng, chẳng hạn, không thể cho phép họ truy cập vào thứ mà họ thường không có quyền truy cập.

báo trước: điều này giả định một ứng dụng dựa trên web hoặc n-tier nơi ủy quyền phía máy chủ là có thể / khả thi. Nếu bạn có một ứng dụng VB trực tiếp thực hiện sql, thì đó là một vấn đề hoàn toàn.


Điều gì về việc không thể chèn sau đó xóa hồ sơ, trong khi duy trì các mối quan hệ khóa ngoài, như được đề cập trong câu hỏi?
psr

Điều đó có liên quan gì đến việc lộ chìa khóa cho người dùng? Có lẽ tôi không hiểu cách bạn sử dụng thuật ngữ 'phơi bày'. Tôi đang làm việc từ giả định mà bạn muốn nói là "người dùng có thể nhìn thấy".
GrandmasterB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.