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

Thiết kế cơ sở dữ liệu MySQL. Chèn các hàng trong bảng 1to1.

Tôi sẽ trả lời đây là một câu trả lời vì tôi cảm thấy đây là một sai sót trong thiết kế.

Đầu tiên, nếu hai bảng ở đúng 1:1 mối quan hệ, tại sao bạn không chỉ có một bảng?

Thứ hai, nếu nó không phải là 1:1 đúng mối quan hệ nhưng là vấn đề siêu kiểu-phụ, bạn cũng không cần khóa ngoại hình tròn này. Hãy nói table1Employeetable2Customer . Tất nhiên, hầu hết khách hàng không phải là nhân viên (và ngược lại). Nhưng đôi khi khách hàng cũng có thể là nhân viên. Điều này có thể được giải quyết bằng 3 bảng:

Person
------
id
PRIMARY KEY: id

Employee
--------
personid
lastname
firstname
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
    REFERENCES Person(id)

Customer
--------
personid
creditCardNumber
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
    REFERENCES Person(id)

Trong trường hợp bạn mô tả, bạn có hai bảng ParentChild1:N mối quan hệ. Sau đó, bạn muốn lưu trữ bằng cách nào đó con hoạt động tốt nhất (dựa trên một phép tính đã xác định) cho mọi phụ huynh.

Điều này có hiệu quả không?:

Parent
------
id
PRIMARY KEY: id

Child
-----
id
parentid
... other data
PRIMARY KEY: id
FOREIGN KEY: parentid
    REFERENCES Parent(id)
UNIQUE KEY: (id, parentid)             --- needed for the FK below

BestChild
---------
parentid
childid
... other data
PRIMARY KEY: parentid
FOREIGN KEY: (childid, parentid)
    REFERENCES Child(id, parentid)

Bằng cách này, bạn thực thi tính toàn vẹn tham chiếu mong muốn (mọi BestChild là Con, mọi Cha mẹ chỉ có một BestChild) và không có đường dẫn vòng tròn trong Tham chiếu. Tham chiếu đến con tốt nhất được lưu trữ trong bảng phụ chứ không phải trong Parent bàn.

Bạn có thể tìm thấy BestChild cho mọi Phụ huynh bằng cách tham gia:

Parent
  JOIN BestChild
    ON Parent.id = BestChild.parentid
  JOIN Child
    ON BestChild.childid = Child.id

Ngoài ra, nếu bạn muốn lưu trữ các phần tử con tốt nhất cho nhiều bài kiểm tra hiệu suất (đối với các loại bài kiểm tra khác nhau hoặc các bài kiểm tra vào các ngày khác nhau), bạn có thể thêm một test và thay đổi Khóa chính thành (test, parentid) :

BestChild
---------
testid
parentid
childid
... other data
PRIMARY KEY: (testid, parentid)
FOREIGN KEY: (childid, parentid)
    REFERENCES Child(id, parentid)
FOREIGN KEY: testid
    REFERENCES Test(id)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để cập nhật bảng để thêm khóa chính và cập nhật tất cả các hàng hiện có với ID tăng dần?

  2. cách khắc phục (2002, Không thể kết nối với máy chủ MySQL cục bộ thông qua socket '/tmp/mysql.sock' (2)) trên bitnami ec2?

  3. Lỗi nhập động vào Mysql bằng PHP

  4. DbUnit thử nghiệm Java MySQL

  5. virtualenv pip mysqldb mac os X python