Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khóa chính tổng hợp so với cột ID bổ sung?

Nói rằng {Author, Title, Edition} xác định duy nhất một cuốn sách, sau đó giữ nguyên các giá trị sau:

  1. Nó là một siêu khóa - xác định duy nhất một bộ (hàng).

  2. Điều này là không thể sửa chữa được - việc loại bỏ bất kỳ cột nào không làm cho nó trở thành một khóa nữa.

  3. Nó là một khóa ứng viên - một superkey không thể thay đổi được là một khóa ứng viên.

Bây giờ chúng ta hãy xem xét ID (số nguyên)

Tôi có thể lý do rằng Book khóa bảng sẽ hiển thị trong một vài bảng khác dưới dạng khóa ngoại và cũng trong một vài chỉ mục. Vì vậy, nó sẽ chiếm khá nhiều không gian - giả sử ba cột x 40 ký tự (hoặc bất cứ thứ gì ...) - trong mỗi bảng này cộng với các chỉ mục phù hợp.

Để làm cho các bảng và chỉ mục "khác" này nhỏ hơn, tôi có thể thêm cột số nguyên-duy nhất vào Book bảng được sử dụng như một khóa sẽ được tham chiếu như một khóa ngoại. Nói điều gì đó như:

alter table Book add BookID integer not null identity;

Với BookID cũng là (phải) duy nhất, Book bảng hiện có hai khóa ứng viên.

Bây giờ tôi có thể chọn BookID làm khóa chính.

alter table Book add constraint pk_Book primary key (BookID);

Tuy nhiên, {Author, Title, Edition} phải giữ một khóa (duy nhất) để ngăn chặn một cái gì đó như thế này:

BookID  Author      Title           Edition
-----------------------------------------------
  1      C.J.Date  Database Design     1
  2      C.J.Date  Database Design     1

Để tổng hợp, hãy thêm BookID - và chọn nó làm tài liệu chính - đã không dừng lại {Author, Title, Edition} là một (ứng cử viên) khóa. Nó vẫn phải có ràng buộc duy nhất của riêng nó và thường là chỉ mục phù hợp.

Cũng lưu ý rằng từ quan điểm thiết kế, quyết định này đã được thực hiện trên "cấp độ vật lý". Nói chung, ở cấp độ logic của thiết kế, ID này không tồn tại - nó đã được giới thiệu trong quá trình xem xét kích thước cột và chỉ mục. Vì vậy, lược đồ vật lý được bắt nguồn từ lược đồ logic. Tùy thuộc vào kích thước DB, RDBMS và phần cứng được sử dụng, không lý luận kích thước nào trong số đó có thể có tác dụng đo lường được - vì vậy hãy sử dụng {Author, Title, Edition} như một PK có thể là thiết kế hoàn toàn tốt - cho đến khi được chứng minh theo cách khác.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi ‘time’ thành ‘smalldatetime’ trong SQL Server (Ví dụ T-SQL)

  2. Linux - PHP 7.0 và MSSQL (Microsoft SQL)

  3. Sử dụng SolarWinds Serv-U trên Linux với Cơ sở dữ liệu xác thực máy chủ SQL

  4. Cách nối chuỗi và giá trị NULL trong SQL Server

  5. Tại sao không có hàm cửa sổ trong mệnh đề where?