Я сейчас занимаюсь проблемой проектирования баз данных, представлю упрощенный сценарий того, что происходит:
Допустим, у меня есть четыре таблицы: Equipment, CurrentState, StateValue, StateType со следующими схемами:
Equipment
------------
Id (PK),
Name
CurrentState
------------
Id (PK),
EquipmentId (FK) (IX),
StateValueId (FK),
StateTypeId (FK) (IX)
StateValue
------------
Id (PK),
StateTypeId (FK),
Name
StateType
-----------
Id (PK),
Name
У единицы оборудования может быть несколько разных CurrentStates, принадлежащих к различным StateTypes, следовательно, Уникальный индекс (IX). StateType - это в основном конечный автомат, а StateValue содержит значения для каждого конечного автомата.
Теперь мой вопрос, а именно 2 вопроса, касается внешних ключей StateTypeId в таблицах CurrentState и StateValue, которые определяют, какой StateType является записью CurrentState и чем StateType является запись StateValue.
Прежде всего, имеет ли этот тип отношений плохой дизайн с точки зрения ссылочной целостности? Я предполагаю, что это плохой дизайн, так как между таблицей CurrentState и таблицей StateType должна быть только одна ссылка, и это происходит через StateValue, в противном случае запись CurrentState может в итоге иметь два разных StateTypes (один через прямой FK и другое через таблицы StateValue FK) ...
Но возникает второй вопрос: если у меня не должно быть StateTypeId FK в таблице CurrentState, как я могу применить Index, то есть убедиться, что не существует двух записей CurrentState для одного EquipmentId, у которых StateValueIds указывает на записи StateValue того же StateType ...
Нужно ли использовать триггер при вставке в таблицу CurrentState для проверки соблюдения правил? Я никогда раньше не использовал триггеры, поэтому мне нужно будет немного изучить. Я также использую Entity Framework и понятия не имею, как это повлияет (в теории не должно быть).