And*_*ler 5 sql polymorphism database-design sql-server-2008 entity-attribute-value
假设我有以下表格:
____________________ ____________________
| 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
? |
| |
-----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
快速解释我在这里要表达的内容:假设我们有一个物种列表,例如猫,狗,人等等.我们还有一组属性(缩写为Props,因此我可以更容易地在图中使用它)适用于某些但不一定适用于所有物种 - 例如,这可能是尾长(对于有尾巴的物种),眼睛颜色(对于有眼睛的人)等.
SpeciesProps是一个链接表,用于定义哪些属性适用于哪些物种 - 所以这里我们会有{人类,眼睛颜色},{狗,眼睛颜色},{猫,眼睛颜色},{狗,尾长},{猫,尾长}.我们没有{Human,Tail Length},因为Tail Length显然不是适用于人类的有效属性.
"生物"表格包含物种的实际"实施" - 所以我们可能会有{人类,鲍勃},{狗,鲁弗斯}和{猫,菲利克斯}.
现在我的问题是:在OrganismPropsValues表中,我想存储每个生物体的属性的"值" - 例如,对于Bob我想存储{Bob,Eye Color,Blue}.对于Rufus,我想存储{Rufus,Eye Color,Brown}和{Rufus,Tail Length,20}(类似于Felix).然而,我的问题是,在我详细描述的模式中,即使在SpeciesProps中不存在{Human,Tail Length}元组,也完全可以存储{Bob,Tail Length,10}.如何修改此模式以便我可以强制执行OrganismPropsValues中SpeciesProps中定义的约束,同时保持足够的规范化?