Có nhiều sự đánh đổi ở đây. Trên thực tế tôi thường xuyên sử dụng các khóa chuỗi, nhưng tôi thường bao gồm các khóa phụ thay thế cho các phép nối (rõ ràng nó sẽ là cách khác nếu tôi đang sử dụng MySQL). Tuy nhiên, có những trường hợp tôi không.
Đầu tiên tôi là một người hâm mộ khai báo các khóa tự nhiên là khóa chính trong đó db có thể xử lý tốt việc này (ví dụ PostgreQuery). Điều này giúp với việc chuẩn hóa và làm cho thiết kế cơ sở dữ liệu rõ ràng hơn. Phím thay thế làm cho việc tham gia dễ dàng hơn.
Có hai lý do tôi thường thêm khóa thay thế:
Không phải lúc nào cũng rõ ràng khóa tự nhiên là gì. Đôi khi những điều này phải được thay đổi. Thay đổi khóa tổng hợp tự nhiên khi được sử dụng để tham gia và tính toàn vẹn tham chiếu rất phức tạp và dễ bị lỗi.
Tham gia hiệu suất trên các phím tổng hợp có vấn đề và một khi bạn đi xuống tuyến đường tự nhiên, bạn sẽ bị kẹt ở đó.
Tuy nhiên, trong trường hợp khóa tự nhiên là xác định, cột đơn và văn bản, tôi thường tham gia vào khóa chuỗi. Lý do của tôi để làm như vậy là điều này thường tránh tham gia vào việc tra cứu. Việc sử dụng phổ biến nhất là cung cấp thiết kế db thích hợp xung quanh trường hợp sử dụng các loại enum. Trong hầu hết các trường hợp, những điều này không yêu cầu tham gia thêm cho các truy vấn thông thường. Vì vậy, đây là trường hợp, các phím chuỗi như các phím tham gia có ý nghĩa hoàn hảo.
Ví dụ: trong LedgerSMB, chúng tôi lưu trữ các phân loại tài khoản. Chúng được xác định bởi tham chiếu chuỗi. Và một số dữ liệu khác được lưu trữ với tham chiếu chuỗi được sử dụng để thực thi các quy tắc liên quan đến kết hợp các phân loại có thể ảnh hưởng đến tài khoản. Thời gian duy nhất mà logic là cần thiết là khi lưu một tập hợp các phân loại, vì vậy chúng tôi tham gia vào khóa chuỗi.
Về lý do tại sao mặc định sẽ là khóa số nguyên, tôi không nghĩ đó chỉ là một câu hỏi về kích thước chỉ mục. Một vấn đề lớn là quản lý chìa khóa. Vì khóa này là tùy ý và bạn có thể xử lý hàng triệu bản ghi, bạn phải có cách tạo các chuỗi duy nhất. Có những trường hợp mọi người sử dụng UUID cho việc này, nhưng có khả năng xảy ra va chạm UUID khác không, và khi hàng tỷ bản ghi được lưu trữ, cơ hội này trở nên đủ cao để người ta có thể thấy trong khi khả năng va chạm với các loại số nguyên tăng là 0 theo định nghĩa.