0

私は、食品の加工からのデータを管理するための mysql ベースのシステムに取り組んでいます。この時点で、次の特定の問題に遭遇しました。

いくつかの項目を含むテーブル A があります。

Farmer      Quantity  
Farmer A    1000 kg  
Farmer B    500 kg

次に、テーブル A からのデータの m:n 集計であるテーブル B があります。

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

m:n 関係を表すために、2 つを接続するテーブル AB があります。

FK_Farmer    FK_Batch 
FarmerA      LI1   
FarmerB      LI1  
FarmerA      LI2  

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

batches テーブルを参照する追加の外部キーをテーブル AB に含める必要がありますか? 外部キーを強制して、同じ列を介してファーマーとバッチ テーブルの両方を参照する必要はありません (そして、再帰などを示すフラグを追加します)。私が見落とした他の明らかな解決策はありますか?

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

4

2 に答える 2

0

親バッチが複数の子バッチを持つことができ、子バッチが複数の親バッチを持つことができる場合、新しいマッピング テーブルが必要です。

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

外部キーを使用して、関係が維持されるようにします。しかし、データベースがループに入るのを防ぐことができるかどうかはわかりません。そのためには、コードまたはストアド プロシージャに頼る必要があるかもしれません。

于 2010-12-08T12:56:09.280 に答える
0

データを表す最も簡単な方法は、親ポインターをバッチ テーブルに追加することです。階層のルートは、このフィールドに NULL があります。非ルートはその親を指し、その親は別の親などを指している可能性があります。

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

しかし、私はそれを回避する簡単な方法を知りません。基本的に、単一のクエリではなくコードでツリーを追跡する予定です。

于 2010-12-06T19:53:22.223 に答える