次のようなデータベースモデルが必要なようです:
このモデルには次のプロパティがあります。
- 基本的に、各レシピは一連のステップです。
- 各ステップには、同じレシピの他のステップ(STEP_NO)、単位(質量、体積、カウントなど)、その単位の数量などとの相対的な順序があります。
- 特定のステップは、材料(INGREDIENT_IDがNULL以外の場合)または別のレシピ(SUBRECIPE_IDがNULL以外の場合)のいずれかに接続されます。
- それ以外は、STEPは多対多の関係を実装するかなり標準的なジャンクションテーブルです。つまり、同じ材料を複数のレシピ(または同じレシピの複数のステップ)で使用でき、レシピは次のようになります。他の複数のレシピの「サブレシピ」。
- これは本質的に有向グラフです。データモデル自体はサイクルを防ぐことはできません。サイクルはクライアントコードレベルで回避する必要があり、トリガーによって検出される可能性があります。
MySQLがCHECK制約をサポートしている場合(サポートしていません )、次のように、そのうちの1つ(両方ではない)がNULL以外であることを確認できます:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
現状では、そのためのトリガーが必要です。