非常に異なる属性を持つさまざまなエンティティを持つシナリオに EAV パターンを使用します。
「基本的な」EAV パターンは 3 つのテーブルで構成されています。属性ごとに異なるデータ型 (日付、ロング、ブール値など) があるため、現在、これを解決する方法を考えています。
最初の方法は、すべてを文字列として保存することです。これには「解析」が必要であり、「1」のような数値を持つことは、これが double、boolean などの場合、直接表示されません。属性値テーブルは次のようになります
id|attribute_id|entity_id|value
1 2 3 17.0
2 4 2 Foobar
2 番目の方法は、さまざまな型をさまざまな列に分割し、次のように値の列を null 可能にすることです。
id|attribute_id|entity_id|value_string|value_long|value_float|value_date
1 2 3 NULL NULL 17.0 NULL
2 4 2 Foobar NULL NULL NULL
ただし、これは基本的に決定がEAVパターンにつながる理由である多くのNULL値を生成します(未使用の列のNULL値を減らします)
したがって、これは、型付き属性テーブルを作成するという 3 番目の可能な解決策につながります。
attribute_values_string
id|attribute_id|entity_id|value
2 4 2 Foobar
attribute_values_float
id|attribute_id|entity_id|value
1 2 3 17.0
ただし、これによりクエリがより複雑になります。常にn
テーブルにattribute_value
. また、このように使用するとattribute_ids
、すべてが独自の auto_increment を使用している場合、異なる値の型が等しくなります。id
そのため、値を別の型に変換することは、維持できないため、やや注意が必要です。もちろん、これattribute_values
は、auto_increment 値を提供し、おそらくいくつかの型情報やメタデータを含む別の型指定されていないテーブルを追加することで回避できます。(バージョニング/リビジョンを使用する必要があるため、自動生成された attribute_values_ids をとにかく使用することはできません。2 つのリビジョンが同じ ID を共有する必要があるためです)
したがって、最初に決定するのはレイアウトです。EAVを使用した経験のある人はいますか? 各試行のボトルネックは何ですか?