2016-06-16 6 views
3

Ich versuche, mein Datenbankdesign richtig zu machen. Es ist eine große Reihe von alkoholischen Getränken, bestehend aus Bier, Schnaps, Wein und so weiter. Ich könnte sie alle in einer einzigen Tabelle halten, wie folgt:Normalisieren einer Datenbank zur Verringerung der Abhängigkeit

id category brand  type price quantity description 

1 Beer  Heineken bottle $2.00 100  some description... 
2 Beer  Calsburg bottle $3.00 200  some description 
3 Beer  Heineken can  $1.00 300  some description.... 
4 Liquor JWalker bottle $30.00 100  some descri... 

scheint dies schlechtes Design Wiederholungen für Kategorie und Marke unter Berücksichtigung auftreten. So teile ich es in drei Tabellen wie folgt:

Kategorie Tabelle

id name(pk) 

1 Beer 
2 Liquor 

Marke Tabelle

id name(pk) category_name(FK) 
1 Heineken Beer 
2 Carlsburg Beer 
3 Lindemans Wine 
4 JWalker  Liquor 

Produkttabelle

id(PK)  type price quantity description  category_name(FK) brand_name(FK) 
1   Bottle $2.00 100   some description Beer    Heineken 

Dachte das wäre besser normalisiert aber so wie ich es sehe, kaum ein Unterschied zur ersten Tabelle. Und ich schließe mit type repeatnig auch, weil ich Wiederholungen auf Flasche bekommen kann, und so weiter. Also sollte ich einen 4. Tisch dafür bekommen?

Versuchen, zu normalisieren und es so sinnvoll wie möglich zu halten. Gibt es einen besseren Weg, dies zu tun?

+0

Die Fremdschlüsselwerte sollten die ID der Zeile in der übergeordneten Tabelle sein, nicht der Wert. – duffymo

+1

Ich denke, es ist in Ordnung, den Namen als PK zu verwenden, wenn sie immer eindeutig sind, aber wie OP darauf hingewiesen hat ... ohne zusätzliche Daten für Marke oder Kategorie, hat das Abspalten der Tabellen keinen großen Vorteil. – mhatch

+1

Sagen Sie Heineken wird von einem anderen Unternehmen gekauft/verkauft und/oder wird umbenannt. Möchten Sie alle Produkte oder nur einen Datensatz in Ihrer Markentabelle aktualisieren? Eine einzelne Tabelle mag verlockend sein, reduziert aber die Flexibilität langfristig (vielleicht nicht reduzieren, sondern hinzufügen). Planen Sie, dass sich dieses System verändert? Wenn ja, so nah wie möglich an 3./4. *** Wenn das wirklich alles ist, was es sein wird, und Sie keine Änderungen erwarten, dann wird eine einzige Tabelle "schneller", nur die Wartung wird schwieriger. – xQbert

Antwort

-2

Tabelle Schöpfung würde wie folgt aussehen:

create table product (
    product_id int not null identity, 
    brand_id int not null, 
    category_id int not null, 
    primary key(product_id), 
    foreign key brand_id references brand(brand_id), 
    foreign key category_id references category(category_id) 
); 

create table brand (
    brand_id int not null identity, 
    name varchar(80), 
    primary key(brand_id) 
); 

create table category (
    category_id int int not null identity, 
    name varchar(80), 
    primary key(category_id) 
); 

Sie trete ein den Datensatz zurück:

select p.product_id, c.name as category_name, b.name as brand_name 
from product as p 
join category as c on p.category_id = c.category_id 
join brand as b on p.brand_id = b.brand_id 
+0

Ich habe keine Ahnung, wovon du sprichst ist ein Beispiel, um zu zeigen, wie fremde Schlüssel in diesem Fall aussehen würden, vielleicht sollten Sie überprüfen, was Normalisierung bedeutet: – duffymo

+0

Ich habe keine neue Spalte hinzugefügt mn Namen. Ich habe zwei Tabellen erstellt, eine für die Kategorie und eine für die Marke, und die Produkttabelle mit Fremdschlüsseln auf sie ausgerichtet. Scheint klassisch zu mir. – duffymo

+1

Die Frage lautet: "Normalisieren und so sinnvoll wie möglich halten. Gibt es einen besseren Weg, dies zu tun?". Die ursprüngliche Tabelle ist in 5NF. Der zweite Entwurf der Frage ist nicht das Produkt der Normalisierung. Es könnte sowieso nicht sein, weil es neue Spalten einführt: ids. Dito für deine Antwort. Man möchte vielleicht IDs hinzufügen; aber es ist keine Normalisierung. PS: Wenn Sie meine Antwort einfach abgelehnt haben, sagen Sie mir bitte das erste, was Sie für falsch halten, und ich werde eine Referenz hinzufügen, um zu zeigen, dass meine Antwort richtig ist. Oder lesen Sie einfach ein Lehrbuch oder Folien (viele online) über Normalisierung. – philipxy

0
Brand Table 
brandID(PK) BrandName 

Category table 
BrandID(FK) CategoryID(PK) Categoryname 

Product table 
ProductID(PK) CategoryID(FK) description price quantity 
+1

Die Kategorie muss nicht mit der Marke verwandt sein, BrandID gehört zum Produkt als Fremdschlüssel – Philipp

0

Normalisierungs erfordert zu wissen, funktionale Abhängigkeiten (FDS) und Abhängigkeiten beitreten (JDs), die halten. Du hast sie nicht gegeben. Also können wir uns nicht normalisieren. Aber raten Sie auf Ihre Anwendung und Ihren Tisch, es ist in 5NF.

Vermutlich ID ist eine eindeutige Spalte. So bestimmt es funktional jeden Spaltensatz. Da keine kleinere Teilmenge von {id} eindeutig ist, handelt es sich um einen Kandidatenschlüssel (CK). Vermutlich haben keine anderen FDs andere als die, die wegen dieser CK halten. Also ist der Tisch in 5NF.

Angenommen, es gibt noch eine weitere FD: dass eine bestimmte Marke immer nur mit derselben Kategorie erscheint. Um dann auf 5NF zu normalisieren, sollte die Spaltenkategorie fallen und eine neue Tabelle sollte mit den Kategorienspalten & und CK {brand} hinzugefügt werden.

Oder angenommen, dass eine Marke eine oder mehrere Kategorien hat und anstelle einer Zeile, die besagt, dass es sich um die Produktkategorie handelt, die Kategorie eine Produktkategorie ist. (Seltsam, seitdem gibt es für Marken mit mehr als einer Kategorie keine Tabelle für eine Produktkategorie.) Dann gibt die Normalisierung auch diese beiden Tabellen mit neuem CK {Kategorie, Marke}. Aber in diesem Fall ist es wegen einer mehrwertigen Abhängigkeit (MVD), dh wegen einer binären JD.

PS Das Einführen von IDs hat nichts mit Normalisierung zu tun.

PPS Sie scheinen zu denken, dass wiederholte Subrow-Werte eine Notwendigkeit zur Normalisierung implizieren. Sie nicht. Die Normalisierung dient dazu, eine Tabelle manchmal durch Tabellen zu ersetzen, die immer mit ihr verbunden sind.

-1

Die Normalisierung durch BCNF basiert auf funktionalen Abhängigkeiten. Es basiert nicht darauf, ob eine Spalte Text oder Zahlen enthält. Sie scheinen zu denken, dass, weil die Kategorie-Spalte das Wort Beer mehr als einmal enthält, muss es "normalisiert" werden. Das ist nicht der Fall.

Was sind die funktionalen Abhängigkeiten hier?

  • id -> Kategorie, Marke, Typ, Preis, Menge, Beschreibung
  • Kategorie, Marke, Typ, -> id, Preis, Menge, Beschreibung

Das zweite FD könnte falsch sein . Es könnte sein, dass {Marke, Typ} die Determinante ist. Aber ich denke, dass es wahrscheinlich irgendwo eine Firma gibt, die sowohl Bier als auch Spirituosen unter dem gleichen Markennamen herstellt. So denke ich , dass die Determinante wahrscheinlich {Kategorie, Marke, Typ} ist.

Das ist in 5NF bereits. "Splitting" wird diese Tabelle nicht verbessern.