Предположим, у меня есть следующие таблицы:
____________________ ____________________
| 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
∞ |
| |
-----------------------------------------------------------
Краткое объяснение того, что я пытаюсь здесь представить: предположим, у нас есть список видов, таких как кошка, собака, человек и т. Д. Мытакже имеют набор свойств (сокращенно «Реквизит», чтобы мне было удобнее разместить его на диаграмме), которые относятся к некоторым, но не обязательно ко всем видам - например, это может быть длина хвоста (для видов с хвостами), цвет глаз (дляте, у кого есть глаза) и т. д.
SpeciesProps - это таблица компоновщиков, которая определяет, какие свойства применимы к какому виду - поэтому здесь мы имеем {Человек, Цвет глаз}, {Собака, Цвет глаз}, {Кошка,Цвет глаз}, {Собака, Длина хвоста}, {Кошка, Длина хвоста}.У нас нет {Человек, Длина Хвоста}, потому что Длина Хвоста, очевидно, не является допустимым свойством, применимым к человеку.
Таблица организмов содержит фактические "реализации" вида - так что здесь мы могли бы иметь {Человек, Боб}, {Собака, Руфус} и {Кошка, Феликс}.
Вот моя проблема: в таблице OrganismPropsValues я хочу сохранить «значения» свойств для каждого организма.-так, например, для Боба я хочу сохранить {Боб, Цвет глаз, Синий}.Для Руфуса я бы хотел сохранить {Руфус, Цвет глаз, Коричневый} и {Руфус, Длина хвоста, 20} (аналогично Феликсу).Моя проблема, однако, заключается в том, что в схеме, которую я подробно описал, вполне возможно хранить {Bob, Tail Length, 10}, даже если кортеж {Human, Tail Length} не существует в SpeciesProps.Как я могу изменить эту схему, чтобы я мог применять ограничения, определенные в SpeciesProps в OrganismPropsValues, при этом поддерживая адекватную нормализацию?