- 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
Ý kiến trên Hacker News
cus_MJA953cFzEuO1zmà Stripe sử dụng. Cũng có cách tạo chúng bằng JavaScript/TypeScript.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