sql >> Databáze >  >> RDS >> PostgreSQL

Hledáte správnou strukturu EAV založenou na jsonb

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:

Č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.




  1. Dynamicky generujte sloupce v PostgreSQL

  2. Objednávka MySql podle (varchar) data v Mmm-dd-rrrr

  3. Jaké jsou známé způsoby uložení stromové struktury v relační databázi?

  4. ORA-08177:Nelze serializovat přístup pro tuto transakci