2010-12-06 12 views
0

私は、食品の処理からデータを管理するためにmysqlベースのシステムで作業しています。 は、私は、次の特定の問題に出くわした。この時点で:私はmとテーブルBを有するm:nの関係の両方のテーブルを参照するデータ

Farmer  Quantity 
Farmer A 1000 kg 
Farmer B 500 kg 

Iは、いくつかのアイテムとテーブルAを有するNテーブルAからのデータのアグレガシオン:Mを表現するために

Batch  Quantity  Quality etc. 
LI1   200 kg  .... 
LI2   12000 kg  .... 

:nの関係私は2つを接続するテーブルABを有する:

FK_Farmer FK_Batch 
FarmerA  LI1 
FarmerB  LI1 
FarmerA  LI2 

問題:表Bのバッチのいくつかは、実際には他のバッチで構成されています...つまり、それらは再帰的に構成されています。私はこの状況を実現するためのデータベース設計の面で最善のアプローチが何であるかを知りたいと思っています。

バッチテーブルを参照してテーブルABに追加の外部キーを含める必要がありますか?私は外部キーを強制して、同じ列を使って農家とバッチテーブルの両方を参照するべきではありません(再帰や何かを示すためにフラグを追加してください)? 他に明白な解決策がありますか?

直接MySQLを介してすべてのデータに対してドリルダウンクエリを実行できることはうれしいことですが、必ずしも必要ではありません。

+0

私が想定しているバッチには、何らかの形の階層があります。少なくともループはないので、親はそれ自身の子孫になることはできません。バッチも分割されているので、複数のバッチの子孫です。 – Orbling

+0

はい、ループはありません。バッチはそれ自体から降下することはできません。私たちは、他の製品から作られた約3〜4層の製品を持っており、それらはまっすぐな階層構造になっています。 Aの処理は製品BおよびCに、製品Bの処理はD、EおよびFへと導かれる。 バッチはいくつかの他のバッチで構成することができる。 1つのバッチが2つ以上の他のバッチに入ることがあります。 重量の換算などがプロジェクトの範囲にないことを保証しながら、バッチを元に戻すことができるかどうかを確認する必要があります。 – Stefan

答えて

0

データを表す最も簡単な方法は、バッチテーブルに親ポインタを追加することです。階層のルートは、このフィールドにnullを持ちます。 root以外の人は、その親を指しています。これは、あなたが持つ可能性のあるレベルのために、別の親などを指し示すかもしれません。

標準SQLはツリーを処理する方法がないため、このような構造のクエリは難しいです。 OracleはSQLの方言に独自の拡張機能を持っていますが、MySQLはそうは思いません。つまり、ツリー全体を追跡するには、クエリをループするコードを書くか、任意の数の最大レベルに対して複数の結合を行うクエリを作成する必要があります。

しかし、私はそれの周りに簡単な方法は分かりません。基本的には、単一のクエリではなくコードでツリーを追うことを計画しています。

0

親バッチが複数の子のバッチを持つことができ、子供のバッチが複数の親のバッチを持つことができるならば、あなたは新しいマッピングテーブルを必要とする:

FK_ParentBatch FK_ChildBatch 
LI1    LI5 
LI1    LI6 
LI2    LI5 
LI2    LI3 
LI3    LI4 

使用外部キーは関係が維持されていることを確認します;データベースがループに陥るのを防ぐことができるかどうかはわかりませんが、コードやストアドプロシージャに依存する必要があります。

関連する問題