SQL:在保留约束的同时规范化数据库

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中定义的约束,同时保持足够的规范化?