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

Câu hỏi thiết kế DB về Khóa ngoại không thể xóa và chuẩn hóa

Một số nhà thiết kế giỏi sử dụng NULL trong các khóa ngoại mà không gây hậu quả bất lợi. Tôi nghiêng mình theo cách đó. FK có thể null thể hiện một mối quan hệ tùy chọn. Trong trường hợp thực thể không có mối quan hệ, FK chứa NULL. Không gian trên cao là tối thiểu. Khi các phép nối (tương đương, chính xác hơn) được thực hiện trên hai bảng, các trường hợp chứa NULL trong FK sẽ bị loại khỏi phép nối và điều đó là phù hợp.

Đã nói rằng, tôi sẽ giới thiệu phương pháp thứ tư cho bạn. Điều này liên quan đến tổng cộng 4 bảng, tài khoản, widget, type và custom_types. Bảng custom_types sử dụng một kỹ thuật có tên là Shared-primary-key, được nêu bên dưới.

CREATE TABLE accounts (
    account_id  INT UNSIGNED AUTO_INCREMENT NOT NULL, 
    # Other Columns...,
    PRIMARY KEY (account_id)
    );  
CREATE TABLE widgets (
    widget_id   INT UNSIGNED AUTO_INCREMENT NOT NULL,
    account_id  INT UNSIGNED NOT NULL, 
    type_id     INT UNSIGNED NOT NULL,
    PRIMARY KEY (widget_id),
    FOREIGN KEY (account_id) REFERENCES accounts(account_id) ON DELETE CASCADE,
    FOREIGN KEY (type_id) REFERENCES types(type_id)
    );  
CREATE TABLE types (
    type_id     INT UNSIGNED AUTO_INCREMENT NOT NULL,
    account_id  INT UNSIGNED NOT NULL, 
    name        VARCHAR(100) NOT NULL,
    PRIMARY KEY (type_id),
    FOREIGN KEY (account_id) REFERENCES accounts(account_id)
CREATE TABLE custom_types (
    type_id     INT NOT NULL,
    account_id  INT UNSIGNED NOT NULL, 
    PRIMARY KEY (type_id),
    FOREIGN KEY (type_id) REFERENCES types(type_id),
    FOREIGN KEY (account_id) REFERENCES accounts(account_id)

);

Cột type_id trong custom_types là một khóa chính được chia sẻ. Lưu ý rằng nó được khai báo CẢ HAI là khóa chính và khóa ngoại, và nó không sử dụng tự động đánh số. Đó là bản sao của khóa chính trong các loại cho mục nhập tương ứng. Bảng loại tùy chỉnh chứa tất cả dữ liệu có trong các loại tùy chỉnh nhưng không có trong các loại đặt trước.

Đối với các kiểu đặt trước, mục nhập được tạo theo kiểu, nhưng không mục nhập nào được tạo theo kiểu tùy chỉnh. Đối với custom_types, đầu tiên một mục nhập được tạo trong các type, sau đó giá trị kết quả của type_id được sao chép vào custom_types, cùng với account_id.

Nếu bạn INNER JOIN các loại và custom_types, thì các loại đặt trước sẽ thoát ra khỏi liên kết. Nếu bạn muốn cả kiểu tùy chỉnh và kiểu đặt trước trong một phép nối, bạn phải sử dụng THAM GIA TRÁI hoặc THAM GIA PHẢI để có được hiệu ứng đó. Lưu ý rằng kết quả của THAM GIA TRÁI hoặc PHẢI sẽ chứa một số NULL, mặc dù các NULL đó không được lưu trữ trong cơ sở dữ liệu.

Nhấp vào này sẽ cung cấp cho bạn mô tả chi tiết hơn về kỹ thuật khóa chính được chia sẻ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ví dụ về Spring Boot CRUD với MySQL

  2. Thông báo lỗi:Ngoại lệ trong chuỗi chính org.hibernate.HibernateException:Lỗi khi truy cập luồng stax

  3. Bản ghi sao chép SQL với một chỉ mục duy nhất

  4. Sửa dữ liệu tuần tự bị hỏng do chỉnh sửa cơ sở dữ liệu MySQL trong trình soạn thảo văn bản?

  5. Tự động triển khai MySQL hoặc Cụm Postgres của bạn từ bản sao lưu