目的:特定のエンティティに関連する属性を保存します。
何年も前に行っていたような、属性値用の個別のテーブルはお勧めしません。 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を設定します
次に、属性を設定するテーブルに、次のフィールドを追加します。
-
AttributeSet" int[] not null default
- その配列フィールドにGINインデックスを追加します
-
intarray
も有効にします https://www.postgresql.org/docs/current/static /intarray.html
これは何を達成しましたか?
属性のツリーを作成しました。次のようになります:
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
のフィールドが必要です。 これにより、クエリを実行する方法を知ることができます。