Vorgeschlagenes Schema
Zuallererst ist hier ein Beispiel für mein vorgeschlagenes Schema, auf das ich in meinem Beitrag verweisen möchte:
Clothes
----------
ClothesID (PK) INT NOT NULL
Name VARCHAR(50) NOT NULL
Color VARCHAR(50) NOT NULL
Price DECIMAL(5,2) NOT NULL
BrandID INT NOT NULL
...
Brand_1
--------
ClothesID (FK/PK) int NOT NULL
ViewingUrl VARCHAR(50) NOT NULL
SomeOtherBrand1SpecificAttr VARCHAR(50) NOT NULL
Brand_2
--------
ClothesID (FK/PK) int NOT NULL
PhotoUrl VARCHAR(50) NOT NULL
SomeOtherBrand2SpecificAttr VARCHAR(50) NOT NULL
Brand_X
--------
ClothesID (FK/PK) int NOT NULL
SomeOtherBrandXSpecificAttr VARCHAR(50) NOT NULL
Problemstellung
Ich habe eine Kleidung Tabelle , die Spalten wie hat Namen, Farbe, Preis, brandid und so weiter zu beschreiben , die Attribute für ein bestimmtes Kleidungsstück.
Hier ist mein Problem: verschiedene Marken s Kleidungs erfordert unterschiedliche Informationen. Was ist die beste Vorgehensweise, um mit einem solchen Problem umzugehen?
Beachten Sie, dass für meine Zwecke markenspezifische Informationen ab einem Kleidungseintrag gesucht werden müssen. Dies liegt daran, dass ich dem Benutzer zuerst die Informationen aus einem Kleidungseintrag anzeige. Danach muss ich die markenspezifischen Informationen verwenden, um den Artikel zu kaufen. Zusammenfassend muss zwischen clothes (from) und den brand_x- Tabellen eine Richtungsbeziehung bestehen .
Vorgeschlagene / aktuelle Lösung
Um damit umzugehen, habe ich mir folgendes Designschema überlegt:
Die Kleidertabelle enthält eine Markenspalte mit ID-Werten von 1 bis x, wobei eine bestimmte ID einer markenspezifischen Tabelle entspricht. Zum Beispiel entspricht der ID-Wert 1 der Tabelle brand_1 (die möglicherweise eine URL- Spalte enthält), ID 2 entspricht brand_2 (die möglicherweise eine Lieferantenspalte enthält ) usw.
Um einen bestimmten Kleidungseintrag mit seinen markenspezifischen Informationen zu verknüpfen, stelle ich mir vor, dass die Logik auf Anwendungsebene ungefähr so aussieht:
clothesId = <some value>
brand = query("SELECT brand FROM clothes WHERE id = clothesId")
if (brand == 1) {
// get brand_1 attributes for given clothesId
} else if (brand == 2) {
// get brand_2 attributes for given clothesId
} ... etc.
Andere Kommentare und Gedanken
Ich versuche, meine gesamte Datenbank in BCNF zu normalisieren, und obwohl mir dies eingefallen ist, macht mir der resultierende Anwendungscode große Sorgen. Es gibt keine Möglichkeit, Beziehungen zu erzwingen, außer auf Anwendungsebene, und daher fühlt sich das Design sehr kitschig und, wie ich vermute, sehr fehleranfällig an.
Forschung
Ich habe mir die vorherigen Einträge angesehen, bevor ich einen Beitrag verfasst habe. Hier ist ein Beitrag mit einem nahezu identischen Problem, das ich gefunden habe. Ich habe diesen Beitrag trotzdem verfasst, weil es den Anschein hat, als ob die einzige Antwort, die bereitgestellt wird, keine SQL- oder designbasierte Lösung enthält (dh, sie erwähnt OOP, Vererbung und Schnittstellen).
Ich bin auch ein Anfänger, wenn es um Datenbankdesign geht, und würde mich über Erkenntnisse freuen.
Offenbar gibt es weitere hilfreiche Antworten zum Stapelüberlauf:
- Hier
- Und hier
- Aaaand here (Schlüsselbegriff ist: Vererbung von Klassentabellen)
Ich habe dort auf die Lösungen verwiesen und anderen vorgeschlagen, die meine Frage finden, dies auch zu tun.
Trotz der oben angegebenen Links bin ich immer noch auf der Suche nach Antworten und würde mich über mögliche Lösungen freuen!
Ich benutze PostgreSQL.