sql >> データベース >  >> RDS >> PostgreSQL

jsonbに基づいて適切なEAV構造を探しています

    目的:特定のエンティティに関連する属性を保存します。

    何年も前に行っていたような、属性値用の個別のテーブルはお勧めしません。 jsonbを配置します 適切なテーブルの右側のフィールドで、Attributesと呼びます。 。 GINを追加します インデックスを付けて、値をすばやくクエリできるようにします。または、内で説明されている他の手法を使用します。

    これを読んでください: https://dba.stackexchange.com/a/174421/7762 >

    ここでの最大の問題は、属性値を事前に定義するつもりかどうかです。そうした場合、それらを保存するための非常に効率的な方法があります。そうでない場合は、標準のJSONオブジェクトをお勧めします。

    属性の名前と値を事前に定義できる場合:

    これにより、最大限の制御と速度が得られ、それでも柔軟性が得られます。

    テーブルのAttributesを作成します これらのフィールドがあります:

    • AttributeID int4 unsigned not null primary key
    • ParentAttributeID int4 unsigned null
    • Name varchar(64) not null
    • Deleted bool not null default false
    • ParentAttributeIDにインデックスを追加します
    • AttributeIDを防ぐためのトリガーを追加します 変更から
    • 削除時にルールを追加し、代わりにDeleted=Trueを設定します

    次に、属性を設定するテーブルに、次のフィールドを追加します。

    これは何を達成しましたか?

    属性のツリーを作成しました。次のようになります:

    ID   Parent  Name
    ----------------------------
    100  NULL    Color
    101  100       Blue
    102  100       Red
    103  100       Green
    110  NULL    Size
    111  110       Large
    112  110       Medium 
    113  110       Small
    

    Itemsというテーブルがあるとします。 その上にAttributeSetを追加しました :

          ItemID: 1234
            Name: Tee Shirt
    AttributeSet: [100, 103, 110, 112]
    

    翻訳すると、これはColor=Greenがあることを意味します 属性、およびSize=Medium 属性。 103 および112 それを保存するのに十分でしたが、「サイズが定義されているすべてのアイテムを表示してください」と言うことができると便利な場合があります。そのため、110が含まれていました。

    この電光石火を高速かつ超柔軟にすることができます。

    SELECT
      "ItemID", "Name"
    FROM
      "Items"
    WHERE "AttributeMap" @> ARRAY[103,112]
    

    Size=Mediumを持つすべてのアイテムを返します およびColor=Green

    または、https://www.postgresqlで他の演算子を使用できます。 .org / docs / 10 / static / Functions-array.html いくつかの素晴らしいクエリを考え出すために。

    属性値がわからないが、それが小さなセットである場合:

    これにより、最高の速度と制御が得られ、さらに柔軟性が高まります。必要に応じて、レビュー用に新しい属性にフラグを立てることができます。

    上記の手法を使用して、Attributesに値を動的に追加することができます。 存在しない場合はテーブル。

    属性値がわからず、値が多様な場合

    これにより、柔軟性が最大になりますが、制御が犠牲になります。

    この場合、これを任意のテーブルに追加するだけです:

    • AttributeMap jsonb not null default '{}'::jsonb
    • そのフィールドにGINインデックスを追加する

    Attributesに対して値を検証するコードを記述します テーブル。単一値か複数値かを示すインジケーターがあります...

    このようにAttributeMapに保存します フィールド:

    {
        "Color": "Green", 
        "Size": "Medium", 
        "Categories": ["Sports", "Leisure"]
    }
    

    カテゴリは複数の属性であることに注意してください。 Attributes内 テーブルには、IsMulti bool not nullのフィールドが必要です。 これにより、クエリを実行する方法を知ることができます。




    1. MySQLのパフォーマンス:SQLのJOINの概要

    2. ハッシュマップをstringarrayに変換する

    3. MariaDBでのNVL()の仕組み

    4. MySQLのリストのサブセットに対する選択