Đây là thiết kế tốt hay xấu để thêm vào, theo mặc định, trường ID trong mỗi bảng trong cơ sở dữ liệu, ngay cả khi bạn không thấy hiện tại sử dụng ID này (Ví dụ trong bảng MxN)?
Đây là thiết kế tốt hay xấu để thêm vào, theo mặc định, trường ID trong mỗi bảng trong cơ sở dữ liệu, ngay cả khi bạn không thấy hiện tại sử dụng ID này (Ví dụ trong bảng MxN)?
Câu trả lời:
Trong nhiều trường hợp, có một ID nhân tạo trên mỗi bảng là rất triệu tập; trong một số trường hợp, đó chỉ là một nỗi đau trong **.
Nói chung, tôi làm điều đó trên mọi dự án tôi đang làm.
Ưu điểm:
Nói chung, việc viết hoặc tạo mã truy cập dễ dàng hơn khi mỗi và mọi bảng có thể được truy cập bởi một trường khóa được gọi là ID
, loại Integer
.
Đôi khi, các phím tự nhiên rất dễ bay hơi. Ví dụ, trong một hệ thống quản lý kho đã rất phức tạp, chúng tôi đã phải đối mặt với nhiệm vụ thay đổi mã sản phẩm, ví dụ như sản phẩm 001234 sẽ được gọi là 002345 trong tương lai. Thật không may, hệ thống đó đã không sử dụng ID nhân tạo, nhưng mã sản phẩm làm khóa chính. Đương nhiên, mã sản phẩm cũng là một khóa ngoại trong hàng chục bảng khác. Do đó, việc đánh số lại thực sự khó khăn và tốn kém và không thể thực hiện được trong giờ làm việc. Phiên bản tiếp theo của phần mềm đã sử dụng ID nhân tạo, vì vậy đây chỉ là một CẬP NHẬT đơn giản trên bảng sản phẩm.
Đôi khi, các phím tự nhiên không phải là duy nhất ngay cả khi chúng phải như vậy. Ở nước tôi, vì một số lý do, một vài SSN đã được ban hành hai lần.
Các khóa lõm trở nên cồng kềnh khi cấu trúc dữ liệu phức tạp; có một bảng phụ phụ với một khóa được kết hợp gồm 4 phần khá khó để làm việc.
Nhược điểm:
Về bản chất, các ID đó không có ý nghĩa gì ngoài hệ thống, vì vậy bạn cần rất nhiều tra cứu để dịch các ID đó thành các khóa tự nhiên.
Lấy khóa trên cùng từ bảng phụ phụ đã nói đòi hỏi một sự tham gia lớn thông qua toàn bộ chữ tượng hình.
Việc hợp nhất dữ liệu đến với các bản ghi hiện tại là khó khăn hơn, bởi vì một lần nữa cần phải tra cứu thêm.
ON UPDATE CASCADE
?
khóa tổng hợp so với khóa tự nhiên và khóa đơn so với khóa ghép là cả hai chủ đề được tranh luận sôi nổi có mặt tích cực và tiêu cực ở cả hai mặt. Chúng giống như các tab so với khoảng trắng và dấu ngoặc nhọn trên các cuộc tranh luận dòng riêng của chúng.
Điều quan trọng nhất là chọn một bên và gắn bó với nó để thống nhất trong toàn bộ cơ sở dữ liệu. nói chung, các khóa tổng hợp được sử dụng đơn giản vì khó có khóa tự nhiên tốt cho mọi bảng và dễ nhất quán hơn khi mọi bảng đều có khóa tổng hợp.
Mỗi bảng nên có PK, số nhận dạng duy nhất hoặc ID khi bạn gọi nó. Trong trường hợp của MxN, bạn có PK, (một hợp chất). Vì vậy, không cần phải có một cái khác.
Xem thêm: Một hoặc hai khóa chính trong bảng nhiều-nhiều?
Sở thích cá nhân của tôi liên quan đến một chủ đề liên quan: PK không nên có mục đích sử dụng khác ngoài việc là PK. Vì vậy, tôi sẽ không sử dụng dữ liệu aa PK, ngay cả khi dữ liệu là "Tự nhiên duy nhất" IE: SSN, Ngày, Mã Zip Ect.
Từ quan điểm thiết kế, đi với khóa chính tự nhiên, ghép và không phát minh ra khóa tổng hợp. Bất cứ điều gì không phải ở đó chỉ làm cho lược đồ trở nên phức tạp hơn để hiểu.
Từ quan điểm hiệu suất trong nhiều cơ sở dữ liệu, truy cập bảng bằng khóa chính số nguyên nhanh hơn bất kỳ cột được lập chỉ mục nào khác. Các cơ sở dữ liệu này cũng sẽ ngầm thêm khóa tổng hợp đó vào bất kỳ bảng nào không có (thường được gọi là "rowid" hoặc "oid" hoặc tương tự), do đó, việc thêm nó rõ ràng sẽ không mất gì cả.
Đối với các bảng MxN (quan hệ), việc truy cập chúng bằng khóa chính không có nghĩa gì; bạn truy cập chúng bằng một trong hai thành phần và nhận tập hợp các thực thể liên quan từ phía bên kia. Vì vậy, đối với các bảng này, không có ý nghĩa gì khi thêm khóa chính tổng hợp.
Đối với các bảng khác có khóa chính tổng hợp tốt hoặc không nguyên, tôi vẫn sẽ không thêm tổng hợp ban đầu, nhưng sẽ xem xét thêm nó trong khi điều chỉnh hiệu suất cho các bảng được truy cập trong các bảng quan trọng về hiệu năng.