5 điểm bởi GN⁺ 2024-06-06 | 2 bình luận | Chia sẻ qua WhatsApp
  • Khóa tự nhiên (Natural key) là loại khóa được dùng trong cơ sở dữ liệu để đảm bảo tính duy nhất
  • Khóa tự nhiên dựa trên dữ liệu thực tế như tên, thành phố, năm, v.v.
  • Ví dụ, trong cơ sở dữ liệu về 50 nhà hàng tốt nhất thế giới, có thể dùng restaurantName, cityName, year làm khóa tự nhiên
  • Tuy nhiên, khóa tự nhiên có thể không đảm bảo được tính duy nhất. Ví dụ, có thể có nhiều nhà hàng trùng tên ở các thành phố khác nhau

Định danh

  • Ngoài việc đảm bảo tính duy nhất, khóa tự nhiên còn phải đảm bảo cả tính định danh
  • Ví dụ, có thể dùng số khung xe hoặc số định danh cá nhân (số CPR) làm khóa tự nhiên
  • Tuy nhiên, cùng một người có thể có nhiều số định danh. Chẳng hạn, tại Đan Mạch, người chuyển đổi giới tính có thể được cấp số CPR mới

Lỗi giấy tờ

  • Khóa tự nhiên dễ bị ảnh hưởng bởi lỗi giấy tờ
  • Có thể xảy ra lỗi nhập liệu, lỗi gõ từ phía người dùng, lỗi chuyển đổi dữ liệu, v.v.
  • Hệ thống phải có khả năng sửa các lỗi này. Vì vậy, dùng khóa bên ngoài làm khóa cơ sở dữ liệu là không phù hợp

Kết luận

  • Dùng khóa tự nhiên trong thiết kế cơ sở dữ liệu không phải là một ý tưởng hay
  • Có thể phát sinh lỗi dữ liệu, và cần phải có khả năng sửa những lỗi đó
  • Vì vậy, tốt hơn hết là luôn dùng khóa nhân tạo cho các bảng trong cơ sở dữ liệu

Ý kiến của GN⁺

  • Vấn đề của khóa tự nhiên: Khóa tự nhiên có thể không đảm bảo được tính duy nhất và tính định danh, đồng thời dễ bị lỗi nhập liệu.
  • Ưu điểm của khóa nhân tạo: Khóa nhân tạo đảm bảo tính duy nhất và tính định danh, đồng thời giúp sửa lỗi dữ liệu dễ hơn.
  • Điểm cần cân nhắc khi dùng ORM: Khi dùng thư viện ORM, việc sử dụng khóa nhân tạo sẽ dễ hơn. Vì ORM quyết định một phần cấu trúc cơ sở dữ liệu, nên dùng khóa nhân tạo sẽ hiệu quả hơn.
  • Sản phẩm có chức năng tương tự: Các công cụ thiết kế cơ sở dữ liệu hoặc thư viện ORM khác cũng khuyến nghị dùng khóa nhân tạo. Ví dụ như Hibernate, Entity Framework.
  • Điều cần cân nhắc khi áp dụng công nghệ: Khi áp dụng thiết kế cơ sở dữ liệu mới, nên cân nhắc các nhược điểm của khóa tự nhiên và ưu tiên dùng khóa nhân tạo. Khóa nhân tạo giúp đảm bảo tính toàn vẹn dữ liệu và dễ sửa lỗi hơn.

2 bình luận

 
GN⁺ 2024-06-06
Ý kiến trên Hacker News
  • ID duy nhất, ngắn gọn và dễ đọc với con người: Ưu tiên các ID như cus_MJA953cFzEuO1z mà Stripe sử dụng. Cũng có cách tạo chúng bằng JavaScript/TypeScript.
  • Số nhận dạng cá nhân: So sánh số CPR của Đan Mạch với SSN của Mỹ. SSN không phải là duy nhất, có thể thay đổi và cũng có thể được cấp cho cả người không phải công dân Mỹ. Khuyến nghị không dùng nó làm khóa cơ sở dữ liệu.
  • Bí danh và nhật ký kiểm toán: Khi dùng khóa tự nhiên như số CPR của Đan Mạch, cần có một bảng riêng để ghi lại các thay đổi. URL cũng có thể dùng làm khóa tự nhiên, nhưng khi thay đổi thì cần tạo bảng chuyển hướng.
  • Giới hạn của khóa tự nhiên: Nếu mã định danh duy nhất thay đổi, phải theo dõi toàn bộ thông tin liên quan. Nếu thêm khóa nhân tạo thì số thông tin cần theo dõi còn nhiều hơn. Mô hình dữ liệu nên phản ánh thế giới thực.
  • Khóa tự nhiên và quyền riêng tư: Nếu khóa tự nhiên chứa thông tin cá nhân, nó có thể lan sang các bảng khác thông qua khóa ngoại.
  • Ví dụ game tag: Ví dụ dùng game tag của PlayStation Network làm khóa tự nhiên. Nếu game tag không thay đổi, có thể dùng nó làm mã định danh duy nhất.
  • Ví dụ trong lĩnh vực y tế: Nếu nhân viên đăng ký nhập sai số sức khỏe cá nhân (PHN), sẽ phát sinh vấn đề. Dùng khóa nhân tạo thì có thể sửa lại sau.
  • Tính không thể kiểm soát của khóa tự nhiên: Tên, địa chỉ, số đăng ký chính thức... đều không thể kiểm soát nên không đáng tin cậy. Cần dùng hệ thống khóa duy nhất.
  • Sử dụng khóa nhân tạo: Nếu mọi bảng đều dùng trường ID duy nhất, việc giải quyết vấn đề sẽ dễ hơn. Vì dữ liệu và quan hệ thường xuyên thay đổi nên khó có thể tin vào khóa tự nhiên.
  • Khả năng thay đổi và ID duy nhất: Khả năng thay đổi đòi hỏi một mã định danh chung xuyên suốt theo thời gian. Cơ sở dữ liệu nên đưa khóa thay thế tường minh vào schema.
 
jsonobject 2024-06-07

Tôi cũng khuyên nên dùng TSID cho khóa nhân tạo, vì nó đã sẵn sàng để đáp ứng môi trường phân tán như global region. Tôi dùng TSID làm PK trong MySQL và DynamoDB.

https://jsonobject.hashnode.dev/using-tsid-as-database-pk