web-dev-qa-db-ja.com

EAVモデルの代替

テーブルの列に関連するメタデータを取得できるデザインパターンを探しています。より具体的には、これが私の状況です。

fieldテーブルのフィールド、cropテーブルのクロップ、modelテーブルの予測モデルを含むデータベースがあります。各fieldは1つのcropに成長し、複数のmodelsにサブスクライブできます。各モデルは、特定のcropに対して異なる種類の予測を提供します。

現在、各cropは農家からの特定の入力セットを許可します。たとえば、すべての作物は植栽日を期待していますが、開花日を期待しているのは一部の作物だけです。したがって、私はgeneric_inputテーブルと作物固有のテーブル(potato_inputsoy_inputなど)。これらのテーブルの各列は、キャプチャする必要がある入力です。

ここで興味深い部分があります。各modelは、必要な作物入力のセットも指定します。つまり、そのモデルが予測を計算できるようにするために設定する必要がある入力。つまり、入力テーブルの特定の列を参照する必要がありますが、これは実際には不可能です。

これまでのところ、私が見つけた唯一の実際の解決策は、Entity-Attribute-Valueパターンです。しかし、私はその使用を警告する投稿( )をたくさん読んだので、その道を進むのは非常に気が進まない。別のオプションは、すべての入力をリストする列挙型またはテーブルを作成することですが、新しい入力を追加する必要がある場合、またはシステムに新しい作物を追加する場合は、そのリストも更新する必要があります。データの重複または不十分な関係の一貫性。

私のユースケースをサポートできる他のパターンはありますか?適切な解決策は何でしょうか?これは、EVAが実際に優れたソリューションになるケースですか?

1

EAVは、格納される値が設計時に特定できず、実行時に取得される場合のソリューションです。状況は少し異なるようです。キャプチャするすべての値はわかっていますが、格納する方法はわかりません。

リレーショナルアプローチの1つは、エンティティの継承を使用することです。これは、_generic_input_や_potato_input_などで記述したものです。各作物は、一般的なテーブルでは1行、特定のテーブルでは1行しか持たないため、この継承をフラット化して使用するビューにすることができます。モデルによって。

各モデルが消費する値が実行時までわからない場合は、_model_attribute_テーブルを導入して各モデルの要件を一覧表示できます。動的SQLを使用して、上記のフラット化されたビューからSELECTを構築します。

データは、汎用の列に格納できます。次に、入力テーブルはcreate table input(crop, value_1, value_2, value_3, .. value_n)になります。さらにメタデータは、作物を列の意味にマッピングします。 「小麦の場合、value_1は植栽日、ポピーの場合、value_1は開花日です。この設計は、ロジックパズルとデバッグが本当に好きな場合に適しています。

そのテーブルをアンピボットしてinput(crop, value_number, value)を取得するのはほんの小さなステップです。次に、value_numberの列の意味をinput(crop, attribute, value)に置き換えて、EAVを取得します。

EAVでの私の経験は、述語( "select planting_date where flowering_date = 1st August")を使用したクエリでは本当にごみですが、モノのすべての値を取得することは問題ありません( "select * from EAV where entity_id = xyz")。返される値のバケットを理解するのはアプリケーションに任されていますが、SQLより優れた働きをします。

EAVは動的スキーマソリューションです。 DBMSでより適切にサポートされているのは、XMLとJSONです。これらにより、テーブルの各行が他の行が保持しない値を保持できます。 DBソフトウェアによっては、JSON/XMLをSQLクエリの一部として解析できます。あなたは言わないが、あなたのモデルもこれらのフォーマットのいずれかで入力を受け入れるかもしれない? 2つのうち、JSONはよりコンパクトで、XMLの方が解析とクエリのエコシステムが豊富です。

3
Michael Green