Cíl:Chcete uložit atribut související s danou entitou.
Nedoporučuji samostatnou tabulku pro hodnoty atributů, jako jsme to možná dělali v minulých letech. Vložte jsonb
pole přímo na příslušné tabulce a nazvěte jej Attributes
. Přidejte GIN
indexujte jej, abyste se mohli rychle dotazovat na hodnoty. Nebo použijte jiné techniky popsané v.
Přečtěte si toto:https://dba.stackexchange.com/a/174421/7762
Největší otázkou zde je, zda máte v úmyslu předdefinovat hodnoty atributů. Pokud tak učiníte, existuje extrémně účinný způsob, jak je uložit. Pokud ne, pak doporučuji standardní objekt JSON.
Pokud můžete předdefinovat názvy a hodnoty atributů:
To vám poskytuje maximální kontrolu, rychlost a stále poskytuje flexibilitu.
Vytvořte tabulku Attribute
který má tato pole:
AttributeID int4 unsigned not null primary key
ParentAttributeID int4 unsigned null
Name varchar(64) not null
Deleted
bool není null výchozí false- Přidejte index do
ParentAttributeID
- Přidejte spouštěč, který zabrání
AttributeID
od změny - Přidejte pravidlo pro mazání a místo toho nastavte Deleted=True
Poté do libovolné tabulky, kterou chcete přiřadit, přidejte toto pole:
AttributeSet" int[] not null default
- Přidejte do pole pole GIN index
- Povolte také
intarray
rozšíření z https://www.postgresql.org/docs/current/static /intarray.html
Čeho se tím dosáhlo?
Vytvořili jste strom atributů. Může to vypadat takto:
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
Řekněme, že máte tabulku s názvem Items
a na něj jste přidali AttributeSet
:
ItemID: 1234
Name: Tee Shirt
AttributeSet: [100, 103, 110, 112]
V překladu to znamená, že má Color=Green
atribut a Size=Medium
atribut. 103
a 112
to stačilo k uložení, ale někdy je příjemné říct "Ukaž mi všechny položky, které mají definovanou jakoukoli velikost", proto bylo zahrnuto 110.
Můžete to udělat bleskurychle a ultra flexibilní.
SELECT
"ItemID", "Name"
FROM
"Items"
WHERE "AttributeMap" @> ARRAY[103,112]
Vrátí všechny položky, které mají Size=Medium
a Color=Green
Nebo můžete použít jiné operátory na https://www.postgresql .org/docs/10/static/functions-array.html přijít s úžasnými dotazy.
Když neznáte hodnoty atributů, ale jedná se o malou sadu:
To vám dává nejvyšší rychlost, kontrolu a je ještě flexibilnější. V případě potřeby můžete označit nové atributy ke kontrole.
Můžete použít výše uvedenou techniku a pouze dynamicky přidávat hodnoty do Attribute
tabulky, pokud neexistují.
Když neznáte hodnoty atributů a hodnoty jsou různé
To vám dává největší flexibilitu, ale na úkor kontroly.
V tomto případě stačí přidat toto do libovolné tabulky:
AttributeMap jsonb not null default '{}'::jsonb
- Přidejte do tohoto pole index GIN
Napište kód pro ověření hodnot podle vašeho Attribute
stůl. Mít tam indikátor, jestli se jedná o jednu nebo více hodnot...
Uložit takto v AttributeMap
pole:
{
"Color": "Green",
"Size": "Medium",
"Categories": ["Sports", "Leisure"]
}
Všimněte si, že kategorie má více atributů. Ve vašem Attribute
tabulky, měli byste mít pole, které je IsMulti bool not null
což vám umožní vědět, jak se na něj dotazovat.