Я ищу способ смоделировать 4 таблицы, чтобы они были согласованными. 2 таблицы являются своего рода типами enum ++: они описывают то, что возможно. Два других - это конкретизация таблиц типов. Пример, упрощенный :):
ActionType
: описывает возможные типы «действий», например, нарезка овощей, готовка, ...
ActionTypeResult
: описывает результат каждого Type
действия
name
type
(<- <code>Type.name)
Так, например, результатом cutting vegables
будут как органические c отходы, так и готовые кусочки овощей (так 2 результата). boiling
также будет иметь 2 результата: приготовленная пища и кипяток (обычно вы избавляетесь от кипящей воды, но это результат этого шага).
Теперь я хочу описать рецепт, что означает , он имеет несколько ActionType
с, но Result
из ActionType
является входом следующего. Итак:
У меня может быть Recipe
сущность, которая состоит из
CookingStep
s, которая связана с ActionType
- чтобы знать, что это за шаг, и какой вид Results
шаг имеет. CookingFlow
s, которые являются Results
(продуктами), которые могут быть введением следующих CookingStep
.
Итак, можно сделать следующее:
Recipe
:
CookingStep
:
recipe
(<- <code>Recipe.name) title
(ну, вы можете дать названиям шагов, в зависимости от рецепта :))
CookingFlow
:
step
(<- <code>CookingStep.title, это источник потока) recipe
(<- <code>Recipe.name, не уверен, действительно ли нам это нужно, так как мы знаем это, потому что он уже связан step
, я не включил в диаграмму ниже) result
(<- <code>ActionTypeResult.name, поэтому знайте, о каком из различных потоков мы говорим) flows to
(<- <code>CookingStep.title, поэтому мы знаем, куда это течет).
Теперь, делая это, я вижу избыточность в отношениях recipe
, но также можно «обмануть»: a CookingStep
типа cut vegables
может иметь отношения с CookingFlow
, который имеет result
boiling water
или boiled food
. Я хочу, чтобы этот обман был запрещен.
Вопрос: как правильно смоделировать это?
Проблема в том, что это может привести к несоответствующим данным (обман). Основная проблема, с которой я столкнулся, заключается в следующем: имея определенный CookingStep, у меня есть ActionType и CookingFlow. Это хорошо. Однако ActionTypeResult, который у меня есть в CookingFlow, в этом случае должен быть тем, который разрешен ActionType, определенным в CookingStep. Я хочу, чтобы правильный ActionType был применен к CookingFlow того же CookingStep. Я могу использовать триггеры на БД, чтобы проверить, правильно ли это; В основном мне было интересно, можно ли смоделировать его без триггеров.