2012-03-13 16 views
2

で多対多階層構造を実装する方法:要するにHow to record sequential collections of records in MySQLこれは、ここで私の質問からのフォローアップであるMySQLの

、私は、MySQLにレシピや命令の別のテーブルを実装します。レシピは、一連の指示書または他のレシピです。たとえば、Peach_preserveレシピと、Peach_preserveを使用するPeach_tartと、一連の他の手順(手順)を想像することができます。 Peach_preserveは他の多くのレシピに使用できます。

私はレシピ内の各命令のための特定の順序を可能にするために、設計推奨されていた私の前の質問で

:私は今、やりたい何

recipe 
id name 
1 Recipe1 
2 Recipe2 

recipe_instruction 
recipe_id instruction_id sortorder 
1   5    1 
1   3    2 
1   4    3 
2   6    1 
2   7    2 
2   3    3 
2   6    4 

レシピA内にあるという考えを組み込むことですサブコンポーネントは、アトミック/離散命令ではなく、別のレシピである可能性があります。だから、私の考えでは、このようにそれを行うことです。

ここ
recipe 
id name 
1 Recipe1 
2 Recipe2 

recipe_instruction 
recipe_id step_id isRecipe sortorder 
1   5    F   1 
1   3    F   2 
1   4    F   3 
2   1    F   1 
2   1    T   2 
2   2    F   3 
2   1    F   4 

あなたはそのうちの1つは他の2つの命令は、その後、Recipe1その後、Recipe1は、3つの手順で構成され、かつRecipe2は、1つの命令で作られていることがわかりますステップ1の繰り返し。私はこのアイデアを捉える他の方法を考えましたが、それらはヌルエントリの束を含んでいます。私は上記に好きではないことは、キーが4つの属性で構成されていることである...

私の質問は以下のとおりです。

  1. DB内の再帰的なアイデアを組み込むことをお勧めしますか?
  2. もしそうなら、これを行う方法ですか、それとも改善することができますか?

クイック編集:私は階層を読み始めています。私の例では、それぞれ1つのレシピに複数の親を持つことができます。

+2

これは、階層クエリまたはBOM(Bill of Material)クエリとも呼ばれます。これは、DB内のツリーの表現に関連しています。あなたがそれらの用語を研究していないなら、多分あなたはすべきです。このようなデータ構造を処理するためのシステムがいくつかあります。 –

+0

それぞれの子が多くの親を持つことができるので、それがツリーであるかどうかはわかりません(つまり、あるレシピが複数のレシピのサブコンポーネントになる可能性があります)。 – JDelage

+0

少なくともDAG(有向非循環グラフ)です。それが木であるかどうかは、あなたのツリーの定義に依存します。私は明らかに、ノードが複数の他のノードを指し示すようにすることができます。数学用語はそれを排除するかもしれない(math.stackexchange.comで議論する)。非循環データ構造でない場合、データにバグがあります(しかし、私はいくつかの挿入が非循環性を確認するか、承認された用語が何であれ)。しかし、6mmのナットのようなものは、多くの異なるアセンブリで使用することができるBOM(Bill of Material)タイプの構造です。 –

答えて

2

これは非常に一般的な手法です。これは、データベース内に階層データ(再帰的に呼び出す)を格納するために使用されます。

ただし、関係がisRecipeフラグの条件であるため、外部キーを使用できないため、アプリケーションで整合性を管理する必要があります。

+0

あなたの第2段落を理解できません... – JDelage

+0

「isRecipe = T」の場合でも、step_idは有効なレシピIDではない3つの値をとることができます。これは私が正当性を意味していたもので、関係する手段でこれを強制することはできませんが、アプリケーション内でこれをやらなければなりません。 – ntziolis

+0

ああ、そうです。はい、あなたが正しい。 – JDelage

関連する問題