Ваши красные стрелки означают, что у продукта не может быть строк в IngredientProperties , если у продукта не было хотя бы одной подходящей строки в ProductProperties . Имеет ли смысл, что ингредиенты продукта не могут иметь плотность, пока продукт не имеет плотности? Это ограничение не существует только с ФК «черная стрелка».
(Имеет ли смысл повторять свойства для каждого продукта? Различаются ли плотность, непрозрачность или цена ингредиента А1 в зависимости от того, в какой продукт он включен?)
FK от IngredientProperties до Ingredients имеет смысл, но это должен быть один агрегированный ключ, а не два отдельных FK, что означает, что PK на Ingredients также должен быть агрегированным ключом, то же самое относится и к ProductProperties .
Edit:
Спасибо за обновление. Как я и предполагал ранее, добавление внешних ключей для совпадения с красными / зелеными стрелками на диаграмме создаст ограничения в базе данных, которые в настоящее время не существуют, что, в свою очередь, может нарушить существующий код, который использует базу данных, если он, например, вставляется в ProductProperties перед вставкой ингредиентов.
Используя агрегированный ключ, вы в основном говорите, что в таблице Ingredients может существовать только один ( ProdID , IngredientID ). Похоже, это уже делается. Если элементы заголовка в кружке обозначают индексы, то данные уже хорошо проиндексированы.
Я подозреваю, что красная стрелка сверху неверна. Есть две строки PropertyKey , но я не думаю, что они представляют одну и ту же вещь, поскольку в каждой таблице есть отдельная PropertyValue . Одна пара представляет свойства продуктов, а другие - ингредиенты, поэтому связывание их вместе вызовет путаницу.
Я все еще не уверен на 100%, что вы ищете, но вот мои рекомендации:
- Настройка (или сохранение) PK / индексов для каждой таблицы, как представлено пунктами в заголовках, обведенными кружком.
- Установите FK для соответствия черным стрелкам из Ingredients и PropductProperties .
- Настройте FK в соответствии с зелеными стрелками.
Индексы - это все, что нужно для эффективного соединения запросов между таблицами. Внешние ключи служат для поддержания «ссылочной целостности». Например, они мешают вам вставить свойства для несуществующего ингредиента.
Есть несколько вещей, которые вы могли бы сделать для нормализации этой базы данных, но я бы не стал ее менять, если у вас нет особых проблем, которые необходимо исправить.