Formål:Du vil gemme attributter relateret til en given enhed.
Jeg anbefaler ikke en separat tabel for attributværdier, som vi kunne have gjort i de forgangne år. Indsæt en jsonb felt lige på den relevante tabel og kald det Attributes . Tilføj en GIN indeks til det, så du hurtigt kan forespørge værdierne. Eller brug de andre teknikker beskrevet heri.
Læs dette:https://dba.stackexchange.com/a/174421/7762
Det største spørgsmål her er, om du har til hensigt at foruddefinere attributværdier. Hvis du gør det, er der en yderst effektiv måde at opbevare dem på. Hvis ikke, så anbefaler jeg et standard JSON-objekt.
Hvis du kan foruddefinere dine attributnavne OG værdier:
Dette giver dig mest kontrol, hastighed og giver stadig fleksibilitet.
Opret en tabel Attribute som har disse felter:
AttributeID int4 unsigned not null primary keyParentAttributeID int4 unsigned nullName varchar(64) not nullDeletedbool ikke null standard false- Tilføj et indeks på
ParentAttributeID - Tilføj en trigger for at forhindre
AttributeIDfra at ændre sig - Tilføj en regel om sletning, sæt i stedet Deleted=True
Tilføj derefter dette felt i enhver tabel, du vil tilskrive:
AttributeSet" int[] not null default- Tilføj et GIN-indeks på det arrayfelt
- Aktiver også
intarrayudvidelse fra https://www.postgresql.org/docs/current/static /intarray.html
Hvad har dette opnået?
Du har oprettet et træ af attributter. Det kan se sådan ud:
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
Lad os sige, at du har en tabel kaldet Items og på den har du tilføjet AttributeSet :
ItemID: 1234
Name: Tee Shirt
AttributeSet: [100, 103, 110, 112]
Når det er oversat, betyder det, at det har Color=Green attributten og Size=Medium attribut. 103 og 112 var nok til at gemme det, men nogle gange er det rart at kunne sige "Vis mig alle varer, der har en hvilken som helst størrelse defineret", derfor var 110 inkluderet.
Du kan gøre denne lynhurtig og ultra fleksibel.
SELECT
"ItemID", "Name"
FROM
"Items"
WHERE "AttributeMap" @> ARRAY[103,112]
Vil returnere alle varer, der har Size=Medium og Color=Green
Eller du kan bruge de andre operatorer på https://www.postgresql .org/docs/10/static/functions-array.html at komme med nogle fantastiske forespørgsler.
Når du ikke kender attributværdierne, men det er et lille sæt:
Dette giver dig mest hastighed, kontrol og er endnu mere fleksibel. Du kan markere nye attributter til gennemgang, hvis det er nødvendigt.
Du kan bruge ovenstående teknik og blot dynamisk tilføje værdier til Attribute tabel, hvis de ikke findes.
Når du ikke kender attributværdierne, og værdierne er forskellige
Dette giver dig den største fleksibilitet, men på bekostning af kontrol.
I dette tilfælde skal du blot tilføje dette til en hvilken som helst tabel:
AttributeMap jsonb not null default '{}'::jsonb- Tilføj et GIN-indeks til det felt
Skriv kode for at validere værdierne mod din Attribute bord. Har en indikator der, hvis det er en enkelt eller multi-værdi...
Gem sådan i AttributeMap felt:
{
"Color": "Green",
"Size": "Medium",
"Categories": ["Sports", "Leisure"]
}
Bemærk, at kategorier er en multi-attribut. I din Attribute tabel skal du have et felt, der er IsMulti bool not null som giver dig mulighed for at vide, hvordan du spørger efter det.