Предположим, у меня есть следующие таблицы:
____________________ ____________________
| 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, при сохранении адекватной нормализации?