Ziel:Sie möchten ein Attribut speichern, das sich auf eine bestimmte Entität bezieht.
Ich empfehle keine separate Tabelle für Attributwerte, wie wir es vielleicht in früheren Jahren getan haben. Fügen Sie ein jsonb ein Feld rechts auf der entsprechenden Tabelle und nennen Sie es Attributes . Fügen Sie einen GIN hinzu index darauf, damit Sie die Werte schnell abfragen können. Oder verwenden Sie die anderen darin beschriebenen Techniken.
Lesen Sie dies:https://dba.stackexchange.com/a/174421/7762
Die größte Frage hier ist, ob Sie beabsichtigen, Attributwerte vorzudefinieren. Wenn Sie dies tun, gibt es eine äußerst effiziente Möglichkeit, sie zu speichern. Wenn nicht, dann empfehle ich ein Standard-JSON-Objekt.
Wenn Sie die Namen UND Werte Ihrer Attribute vordefinieren können:
Dies gibt Ihnen die größte Kontrolle, Geschwindigkeit und bietet dennoch Flexibilität.
Erstellen Sie ein Tabellen-Attribute die diese Felder hat:
AttributeID int4 unsigned not null primary keyParentAttributeID int4 unsigned nullName varchar(64) not nullDeletedbool not null default false- Fügen Sie einen Index für
ParentAttributeIDhinzu - Fügen Sie einen Trigger hinzu, um
AttributeIDzu verhindern vor Änderungen - Fügen Sie eine Regel zum Löschen hinzu und setzen Sie stattdessen Deleted=True
Fügen Sie dann in jeder Tabelle, die Sie mit Attributen versehen möchten, dieses Feld hinzu:
AttributeSet" int[] not null default- Fügen Sie diesem Array-Feld einen GIN-Index hinzu
- Aktivieren Sie auch das
intarrayErweiterung von https://www.postgresql.org/docs/current/static /intarray.html
Was hat das bewirkt?
Sie haben einen Baum von Attributen erstellt. Das könnte so aussehen:
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
Angenommen, Sie haben eine Tabelle mit dem Namen Items und darauf haben Sie AttributeSet hinzugefügt :
ItemID: 1234
Name: Tee Shirt
AttributeSet: [100, 103, 110, 112]
Übersetzt bedeutet das, dass es die Color=Green hat -Attribut und Size=Medium Attribut. 103 und 112 waren genug, um das zu speichern, aber manchmal ist es schön, sagen zu können "Zeig mir alle Artikel, für die eine beliebige Größe definiert ist", deshalb wurde 110 aufgenommen.
Sie können dies blitzschnell und ultraflexibel machen.
SELECT
"ItemID", "Name"
FROM
"Items"
WHERE "AttributeMap" @> ARRAY[103,112]
Gibt alle Artikel mit Size=Medium zurück und Color=Green
Oder Sie können die anderen Operatoren auf https://www.postgresql verwenden .org/docs/10/static/functions-array.html einige tolle Abfragen zu entwickeln.
Wenn Sie die Attributwerte nicht kennen, es sich aber um einen kleinen Satz handelt:
Dies gibt Ihnen die höchste Geschwindigkeit, Kontrolle und ist noch flexibler. Bei Bedarf können Sie neue Attribute zur Überprüfung melden.
Sie können die obige Technik verwenden und dem Attributes einfach dynamisch Werte hinzufügen Tabelle, falls sie nicht existieren.
Wenn Sie die Attributwerte nicht kennen und die Werte unterschiedlich sind
Das gibt Ihnen die größte Flexibilität, aber auf Kosten der Kontrolle.
Fügen Sie in diesem Fall einfach dies zu einer beliebigen Tabelle hinzu:
AttributeMap jsonb not null default '{}'::jsonb- Fügen Sie diesem Feld einen GIN-Index hinzu
Schreiben Sie Code, um die Werte anhand Ihres Attribute zu validieren Tisch. Haben Sie dort einen Indikator, ob es sich um einen Einzel- oder Mehrfachwert handelt ...
Speichern Sie so in der AttributeMap Feld:
{
"Color": "Green",
"Size": "Medium",
"Categories": ["Sports", "Leisure"]
}
Beachten Sie, dass Kategorien ein Mehrfachattribut ist. In Ihrem Attribute Tabelle sollten Sie ein Feld haben, das IsMulti bool not null ist Dadurch wissen Sie, wie Sie danach fragen können.