Wie modellieren Sie benutzerdefinierte Attribute von Entitäten?
Sagen wir, wir haben eine Anwendung, die in der Lage sein sollten, die zum speichern aller Arten von Produkten. Jedes Produkt hat mindestens eine ID
und ein Name
aber alle anderen Attribute können definiert werden, indem der Nutzer selbst.
- E. g. Er könnte erstellen Sie eine Produktgruppe Ipods, die würde, die Attribute enthalten, die Kapazität und generation
- E. g. Er könnte erstellen Sie eine Produktgruppe T-Shirts mit den Attributen Größe und Farbe
- Wir speichern die definition des Produktes und der konkreten Produkte selbst.
- Wir wollen sicherstellen, dass es ist leicht möglich, Aggregatfunktionen (GROUP-BY), indem Sie Produkt-Attribute. E. g. wählen Sie die Summe der Kapazität für jede generation von ipods
- Muss die Lösung nicht verlangen, schema-änderungen (hinzugefügte Anforderung durch Eingabe von Bill Karwin - siehe seine Antwort so gut!)
Wie würden Sie Ihr Modell-schema in Bezug auf die oben genannten Anforderungen?
Hinweis: Requirment 4. ist wichtig!!!!
Danke an alle für den Beitrag und Diskussion des Ansatzes. Ich habe einige Lösungen gesehen, um dieses problem in der Vergangenheit, aber keiner von Ihnen machte die Gruppierung leicht für mich 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Gruppierung wird nicht leicht sein würde, denn was die aggregate-operator verwenden Sie unter "Farbe"? Beachten Sie, dass es ist nicht möglich, Ihre Anforderung 4 auf Fall 2.
In jedem Fall der Aggregation ist nur schwierig, weil der variation in den Daten-Typen und verringert werden kann, durch Annäherung an Sie in einer mehr typesafe Weg, zu wissen, dass es nie sinnvoll, äpfel und Orangen.
Dies ist die klassische EAV-Modell und es ist ein Ort, in Datenbanken, in denen gezielt entwickelt. Um es ein bisschen mehr typesafe, ich habe gesehen, Fälle, in denen die Werte gespeichert werden in Typ-sichere Tabellen statt in einer einzigen freie form varchar-Spalte.
Statt Werten:
Haben Sie mehrere Tabellen:
Dann, um Ihre iPod-Kapazität pro generation:
Ich würde empfehlen, entweder die Concrete Table Inheritance oder die Class Table Inheritance designs. Beide Ausführungen erfüllen alle vier Kriterien erfüllen.
In Concrete Table Inheritance:
product_ipods
mit SpaltenID
,Name
,Capacity
,Generation
.product_tshirts
mit SpaltenID
,Name
,Size
,Color
.product_ipods
undproduct_tshirts
.SELECT SUM(Capacity) FROM product_ipods GROUP BY Generation
;In Class Table Inheritance:
Generische Produkt-Attribute gespeichert werden, die in Tabelle
Products
mit SpaltenID
,Name
.Ipods gespeichert sind in Tabelle
product_ipods
mit Spaltenproduct_id
(Fremdschlüssel zuProducts.ID
),Capacity
,Generation
.product_tshirts
mit Spaltenproduct_id
(Fremdschlüssel zuProducts.ID
),Size
,Color
.products
,product_ipods
, undproduct_tshirts
.SELECT SUM(Capacity) FROM product_ipods GROUP BY Generation
;Siehe auch meine Antwort an "Product-Tabelle, viele Arten von Produkt, wird jedes Produkt hat viele Parameter" wo ich beschreibe verschiedene Lösungen für die Art von problem, das Sie beschreiben. Ich gehe auch ins detail über genau das, warum die EAV ist eine defekte Konstruktion.
Re Kommentar von @dcolumbus:
Ich würde erwarten, dass die price-Spalte in der
products
Tisch, wenn jede Art von Produkt hat einen Preis. Mit CTI -, dem Produkt-Tabellen in der Regel nur Spalten für Attribute, die spezifisch für die Art des Produktes. Jegliche Attribute, die allgemein für alle Produkt-Typen erhalten Sie Spalten in der übergeordneten Tabelle.In einem line-Elemente-Tabelle, speichern Sie die Produkt-id, die sollte den gleichen Wert sowohl in der
products
Tabelle und dieproduct_ipods
Tabelle.Wieder Kommentare von @dcolumbus:
Den Punkt in der sub-Tabelle wird zum speichern der Spalten, die nicht benötigt werden, die von allen anderen Produktarten.
Die Verbindungs-id kann ein auto-Inkrement-Nummer. Die sub-Typ-Tabelle muss nicht automatisch Inkrementierte eigene id, denn es kann nur den Wert verwenden, der erzeugt durch den super-Tabelle.
product_ipods
eine variation mit seinem eigenen Preis? Auch beim speichern, um Einzelposten, würden Sie dann speichern die Zeile ausproduct_ipods
wie die werbebuchung?ProductA
haben kann "Größe" und "Mitgliedschaft", und je nachdem, was gewählt wird (groß, 3 Jahre), der Preis ändert. Wie passt in dieses Szenario?products
Tabelle und die sub-Tabelle. Es ist üblich, für jede Variante ein Produkt zu erhalten, eine deutliche SKU-Nummer aus diesem Grund.id
?SELECT
undJOIN
den beiden Tabellen, bekomme ich jedes Produkt zurück (vonproduct_id
), aber wenn es mehrere "Produkte", die wirklich repräsentieren die ein Produkt, wie auf der Erde kann ich machen, dass die Arbeit?Class Table Inheritance
Struktur, um sich alle möglichen Optionen. Das ist, was ich wirklich nicht herausfinden können. Ich bin wirklich dankbar für all Ihre Hilfe mit diesem!TABELLE ERSTELLEN für die neuen Produkte und ALTER TABELLE durch hinzufügen/entfernen von Spalten wie der Benutzer führt die Operationen. Verwenden Sie das schema an, zu wissen, welche Eigenschaften jedes Produkt hat. Dieser erfüllt alle vier Anforderungen.
Würden Sie müssen auch eine Tabelle zum speichern der anderen Tabellen-Namen oder Präfix der Tabellen, mit etwas, das Sie Abfragen können, gegen sysobjects für die Tabellen:
Klingt wie Sie auf der Suche nach design Produkt Katalog-Datenbank.
Empfehle ich dieses Vorgehen. http://edocs.bea.com/wlp/docs40/catalog/schemcat.htm
Frage ich mich, wie zu überwinden, Probleme bei der Verwendung des BLOB-Muster als eine alternative der EAV.
Nehmen wir an, dass wir ablegen konnten alle benutzerdefinierten Felder der Entität, die in einem Feld als string, z.B. im JSON-so etwas wie tihis:
{customField1: Wert1, customField2: Wert2, ...,
customFieldN: wertn}
Wie zu überwinden die folgenden Probleme:
1. Welche Verfahrensweise durch separate benutzerdefinierte Felder, zum Beispiel zum Auffinden von Entitäten mit den Bedingungen custField1 = value1 UND customField2 = Wert2?
2. How to mantain Integrität der Daten, zum Beispiel, wenn wir löschen Sie ein benutzerdefiniertes Feld für die Einheit, wie Sie alle Werte löschen oif diese benutzerdefinierten Felder in der Entität.