SQL: Нормализация базы данных с сохранением ограничений

Предположим, у меня есть следующие таблицы:

     ____________________             ____________________
    |     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
              ∞                                                         |
              |                                                         |
              -----------------------------------------------------------

Краткое объяснение того, что я пытаюсь здесь изобразить: предположим, у нас есть список видов, таких как кошка, собака, человек и т. д. У нас также есть набор свойств (сокращенно Props, чтобы мне было легче разместить его на диаграмме), которые применяются к некоторым, но не обязательно ко всем видам - ​​например, это может быть длина хвоста (для видов с хвостами), цвет глаз (для тех, у кого есть глаза) и т. д.

SpeciesProps - это таблица компоновщика, которая определяет, какие свойства применимы к каким видам - ​​так что здесь у нас будет {Человек, Цвет глаз}, {Собака, Цвет глаз}, {Кошка , Цвет глаз}, {собака, длина хвоста}, {кошка, длина хвоста}. У нас нет {Human, Tail Length}, потому что длина хвоста, очевидно, не является допустимым свойством для применения к человеку.

Таблица "Организмы" содержит фактические "реализации" вида - Итак, здесь у нас может быть {Human, Bob }, {Dog, Rufus} и {Cat, Felix}.

Вот моя проблема: в таблице OrganismPropsValues ​​я хочу сохранить «значения» свойств для каждого организма - например, для Боб, я хочу сохранить {Боб, цвет глаз, синий}. Для Руфуса я хотел бы сохранить {Руфус, Цвет глаз, Коричневый} и {Руфус, Длина хвоста, 20} (аналогично Феликсу). Однако моя проблема заключается в том, что в схеме, которую я подробно описал, вполне возможно сохранить {Bob, Tail Length, 10}, даже если кортеж {Human, Tail Length} не существует в SpeciesProps. Как я могу изменить эту схему, чтобы обеспечить соблюдение ограничений, определенных в SpeciesProps в OrganismPropsValues, при сохранении адекватной нормализации?

5
задан Cory 24 August 2011 в 23:50
поделиться