PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Poszukiwanie odpowiedniej struktury EAV opartej na jsonb

Cel:Chcesz przechowywać atrybut powiązany z daną encją.

Nie polecam osobnej tabeli dla wartości atrybutów, jak moglibyśmy to zrobić w minionych latach. Umieść jsonb pole bezpośrednio w odpowiedniej tabeli i nazwij je Attributes . Dodaj GIN indeksuj do niego, dzięki czemu można szybko zapytać o wartości. Lub użyj innych technik opisanych w tym dokumencie.

Przeczytaj to:https://dba.stackexchange.com/a/174421/7762

Największe pytanie dotyczy tego, czy zamierzasz wstępnie zdefiniować wartości atrybutów. Jeśli tak, istnieje niezwykle wydajny sposób ich przechowywania. Jeśli nie, polecam standardowy obiekt JSON.

Jeśli możesz wstępnie zdefiniować nazwy ORAZ wartości atrybutów:

Daje to największą kontrolę, szybkość i nadal zapewnia elastyczność.

Utwórz tabelę Attribute który ma te pola:

  • AttributeID int4 unsigned not null primary key
  • ParentAttributeID int4 unsigned null
  • Name varchar(64) not null
  • Deleted bool nie null domyślna fałsz
  • Dodaj indeks do ParentAttributeID
  • Dodaj wyzwalacz, aby zapobiec AttributeID przed zmianą
  • Dodaj regułę usuwania zamiast tego ustaw Deleted=True

Następnie w dowolnej tabeli, którą chcesz przypisać, dodaj to pole:

Co to osiągnęło?

Stworzyłeś drzewo atrybutów. Może to wyglądać tak:

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

Załóżmy, że masz tabelę o nazwie Items a na nim dodałeś AttributeSet :

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

Po przetłumaczeniu oznacza to, że ma Color=Green oraz atrybut Size=Medium atrybut. 103 i 112 wystarczyło, aby to zapisać, ale czasami fajnie jest móc powiedzieć „Pokaż mi wszystkie elementy, które mają określony rozmiar”, dlatego 110 zostało uwzględnione.

Możesz sprawić, że ta błyskawica będzie szybka i niezwykle elastyczna.

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

Zwróci wszystkie elementy, które mają Size=Medium i Color=Green

Możesz też użyć innych operatorów na https://www.postgresql .org/docs/10/static/functions-array.html aby wymyślić kilka niesamowitych zapytań.

Gdy nie znasz wartości atrybutów, ale jest to mały zestaw:

Daje to największą szybkość, kontrolę i jest jeszcze bardziej elastyczne. W razie potrzeby możesz oznaczyć nowe atrybuty do sprawdzenia.

Możesz użyć powyższej techniki i po prostu dynamicznie dodawać wartości do Attribute tabeli, jeśli nie istnieją.

Kiedy nie znasz wartości atrybutów, a wartości są zróżnicowane

Daje to największą elastyczność, ale kosztem kontroli.

W takim przypadku po prostu dodaj to do dowolnej tabeli:

  • AttributeMap jsonb not null default '{}'::jsonb
  • Dodaj indeks WZ do tego pola

Napisz kod, aby zweryfikować wartości względem Twojego Attribute stół. Miej tam wskaźnik, jeśli jest to jedno lub wielowartościowe...

Przechowuj w ten sposób w AttributeMap pole:

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

Zwróć uwagę, że Kategorie mają wiele atrybutów. W swoim Attribute w tabeli powinieneś mieć pole IsMulti bool not null co pozwoli ci wiedzieć, jak o to zapytać.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql, zaktualizuj lub wstaw w zależności od przypadku

  2. Heroku psql:FATAL:pozostałe gniazda są zarezerwowane dla połączeń superużytkownika bez replikacji

  3. Dialekt musi być wyraźnie podany od wersji 4.0.0

  4. PostgreSQL 9.3:Jak wstawić UUID pisany wielkimi literami do tabeli

  5. Jak wstawić JSONB do Postgresql za pomocą Pythona?