Giả sử tôi có các bảng sau:SQL: Bình thường hoá cơ sở dữ liệu trong khi vẫn giữ chế
____________________ ____________________
| Organisms | | Species |
|--------------------| |--------------------|
|OrganismId (int, PK)| |SpeciesId (int, PK) |
|SpeciesId (int, FK) |∞---------1|Name (varchar) |
|Name (varchar) | |____________________|
|____________________| 1
1 |
| |
| |
∞ ∞
______________________ ____________________ _______________
| OrganismPropsValues | | SpeciesProps | | Props |
|----------------------| |--------------------| |---------------|
|OrganismId (int, FK) | |PropId (int,PK,FK) | ∞-----1|PropId (int,PK)|
|PropId (int, FK) | |SpeciesId(int,PK,FK)| |Name (varchar) |
|Value (varchar) | |____________________| |_______________|
|______________________| 1
∞ |
| |
-----------------------------------------------------------
Một lời giải thích nhanh chóng về những gì tôi đang cố gắng để thể hiện đây: giả sử chúng ta có một danh sách các loài, chẳng hạn như mèo, chó Chúng tôi cũng có một tập hợp các thuộc tính (đạo cụ viết tắt để tôi có thể phù hợp với nó dễ dàng hơn trong sơ đồ) áp dụng cho một số nhưng không nhất thiết phải tất cả các loài - ví dụ, có thể là đuôi dài (đối với loài có đuôi), màu mắt (đối với những người có mắt), v.v.
Loài là một bảng liên kết xác định thuộc tính nào áp dụng cho loài nào - vì vậy ở đây chúng tôi sẽ ld có {Con người, Màu mắt}, {Chó, Màu mắt}, {Mèo, Màu mắt}, {Chó, Chiều dài đuôi}, {Mèo, Chiều dài đuôi}. Chúng tôi không có {Human, Tail Length} vì Tail Length rõ ràng không phải là tài sản hợp lệ để áp dụng cho con người.
Bảng sinh vật thực sự "triển khai" của các loài - Vì vậy, ở đây chúng tôi có thể có {Human, Bob}, {Dog, Rufus} và {Cat, Felix}.
Đây là vấn đề của tôi: trong bảng OrganismPropsValues, tôi muốn lưu trữ 'giá trị' của thuộc tính cho từng sinh vật - ví dụ, đối với Bob, tôi muốn lưu trữ {Bob, Eye Color, Blue}. Đối với Rufus, tôi muốn lưu trữ {Rufus, Eye Color, Brown} và {Rufus, Tail Length, 20} (tương tự cho Felix). Tuy nhiên, vấn đề của tôi là trong lược đồ mà tôi đã trình bày chi tiết, có thể lưu trữ {Bob, Tail Length, 10}, mặc dù tuple {Human, Tail Length} không tồn tại trong SpeciesProps. Làm thế nào tôi có thể sửa đổi lược đồ này để tôi có thể thực thi các ràng buộc được xác định trong SpeciesProps trong OrganismPropsValues, trong khi duy trì chuẩn hóa đầy đủ?
Tùy thuộc vào DB (ví dụ Oracle) Tôi sẽ tạo một số thủ tục lưu trữ cho INSERT/UPDATE/DELETE và thực hiện bất kỳ ràng buộc phức tạp nào trong đó ... – Yahia
@Yahia cảm ơn đề xuất, nhưng nếu có cách nào để làm điều này mà không cần giới thiệu quy trình, trình kích hoạt, v.v. Tôi thích điều đó. Đây là MS-SQL (2008). – Andrew
Điều đó khiến tôi đau đầu.Điều này sẽ rất khủng khiếp khi truy vấn (nghĩ có bao nhiêu người tham gia sẽ nhận được tất cả dữ liệu về con người!) Và là một thiết kế tồi tệ đến nỗi tôi không biết bắt đầu từ đâu. Cơ sở dữ liệu không phải là Đối tượng và không được thiết kế như đối tượng. Các bảng EAV là một giải pháp cực kỳ kém. Thuê một nhà thiết kế cơ sở dữ liệu thực sự. – HLGEM