Krautkanal.com

Veröffentlicht am 2015-02-13 10:59:45 in /prog/

/prog/ 6611: SQL-Frage

yassiryahya Avatar
yassiryahya:#6611

Hallo Bernd,

ich modeliere gerade ein Datebankmodell und komme nicht weiter.
Konsidiere das folgende:
Ein Netzladen bietet n Produkte an. Diese Produkte unterscheiden sich voneinander dadurch, dass beispielsweise Produkt A das Attribut Farbe, Produkt B das Attribut Durchmesser und Produkt C das Attribut Länge und Breite hat. (Oder anders ausgedrückt: Jedes Produkt hat eine individuelle Anzahl an Spalten; es wird davon ausgegangen, dass jedes Produkt verschieden ist).
Ein einzelnes Produkt wird wiederum in Produktvariationen eingeteilt (1-zu-m-Beziehung), welche sich voneinander durch die Eigenschaften des Produktes unterscheiden. Beispiel: Produkt A besitzt zwei Produktvariationen, eine rote Version von A und eine blaue Version von A.

Wie kann ich dies am besten in SQL-Umsetzen? Besonders die Tatsache, dass Produkt kein einheitlicher Datentyp sein kann, sondern völlig unterschiedliche Spalten haben kann bereitet mir Kopfzerbrechen.

Drin vor: Nutze eine Dokumentorientierte Datenbank

Vielen dank im Vorraus.:3

johnriordan Avatar
johnriordan:#6612

Du nimmst eine Tabelle mit Produkten und diverse Tabellen mit Produkteigenschaften und dann eine, die jedem Produkt die entsprechenden Eigenschaften zuweist. Darum nennt man das relational.

Ein Anfang wäre für jede Art eine Tabelle zu machen und dann Redundanzen aufzulösen.

Wikipedia hat auch einen prima Artikel zur Normalisierung:
de.wikipedia.org/wiki/Normalisierung_(Datenbank)

orkuncaylar Avatar
orkuncaylar:#6615

>>6612
Nachdem ich mein Datenbanschema nun nach der 3. NF normalisiert habe sieht es nun so aus:


CREATE OR REPLACE TABLE 'products' (
    id INT,
    name VARCHAR(255),
    desc TEXT,
    price DECIMAL(6,2),
    PRIMARY KEY (id)
);

CREATE OR REPLACE TABLE 'product_variants' (
    id INT,
    product_id INT,
    stock_quantity INT,
    PRIMARY KEY (id),
    FOREIGN KEY (id)
        REFERENCES product(id)
        ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE OR REPLACE TABLE 'product_properties' (
    id INT,
    product_id INT,
    name VARCHAR(255),
    PRIMARY KEY (id),
    FOREIGN KEY (product_id)
        REFERENCES product(id)
        ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE OR REPLACE TABLE 'product_property_values' (
    variant_id INT,
    property_id INT,
    value VARCHAR(255),
    PRIMARY KEY (variant_id, property_id)
    FOREIGN KEY (variant_id)
        REFERENCES product_variant(id)
        ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (property_id)
        REFERENCES product_property(id)
        ON UPDATE CASCADE ON DELETE CASCADE
);


Sieht das einigermaßen okeh aus?

cyril_gaillard Avatar
cyril_gaillard:#6675

1. das Ding hat Fehler und lässt sich (bei mir) nicht ausführen
2. ID-Spalten benennt man am besten überall gleich (in der Tabelle wo sie PrimaryKey sind gleich wie in der Tabelle wo sie ForeignKey sind) - statt id nimm besser gleich überall product_id
3. erspare uns die Arbeit und machs gleich in SQL-Fiddle, auch wenn das evtl dein Zielsystem (MariaDB?) nicht kann