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:
AttributeSet" int[] not null default
- Dodaj indeks GIN do tego pola tablicy
- Włącz także
intarray
rozszerzenie z https://www.postgresql.org/docs/current/static /intarray.html
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ć.