2010-02-01 13 views
5

Ich entwerfe meine erste Datenbank für MySQL und die Idee hier ist, dass wir Bestellungen haben, die mehrere verschiedene Artikel enthalten können. Also entschied ich mich, die Bestellung mit allen relevanten Informationen in einer Tabelle zu speichern, die Artikel in einer anderen, und dann eine dritte Tabelle zu erstellen, in der jeder bestellte Artikel gespeichert wird. Natürlich muss ich jedes Mal, wenn ich eine Bestellung auflisten muss, jede OrderedItemsID finden, für die OrderID die gleiche ist wie die OrderID, die ich benötige, und diese mit Artikeln vergleichen.Was ist falsch an diesem SQL-Schema?

Jetzt da dies mein erstes DB-Design ist, bin ich nicht arrogant genug, um zu denken, dass es eine gute Lösung ist, also habe ich mich gefragt, ob jemand eine gute Lösung für diese Art von Problem kennt? Dank

Bild ist bei http://img211.imageshack.us/img211/5575/stackoverflowq.png

+1

, die für einen ersten Versuch in Ordnung, gute Arbeit sieht :) – rjohnston

+1

gut! Gut gemacht auf dem 'PriceAtPurchase' Attribut; Ich vermute, dass viele Anfänger den Fehler begehen würden, anzunehmen, dass "Price" nicht von "Items" dupliziert werden sollte - doch wie Sie richtig bemerkt haben, ist dies keine Duplizierung! Und; Wie Russ hervorhebt, kann ein ähnliches für mögliche Attribute sowohl für "Bestellungen" als auch für "Bestellte Artikel" in Betracht gezogen werden. Die einzige Sache, die ich hinzufügen muss, ist, dass die Verwendung eines neuen künstlichen Schlüssels auf "OrderedItems" Sie mit einem Attribut belässt, das ** NO ** bedeutet, ** NIE ** referenziert wird und dazu führen kann, dass Anomalien aktualisiert werden. Es ist ein strittiges Thema, aber ich denke, du siehst, wo ich stehe. ^^ –

Antwort

4

Diese Lösung ist in Ordnung, wenn auch in der Tabelle Aufträge i in einem Gesamtpreis, Steuern und Versand setzen würde. Auf diese Weise müssen Sie nicht in die OrderItems-Tabelle gehen, um die Summen zu erhalten.

Zusätzlich möchten Sie alles aus dem Artikel in der Orderitem-Tabelle speichern. Dies beinhaltet den Namen und die Beschreibung. Der Grund ist Verantwortlichkeit. Wenn jemand den Namen eines Gegenstands in der Tabelle ändert, wird dies für den Empfang des Besitzers wesentlich geändert. und du willst das nicht tun.

Grundsätzlich gesagt, müssen alle Informationen in den Auftragstabellen nicht auf die tatsächlichen Artikel Tabellen angewiesen sein.

Sie können dies auch weiter nehmen, um die Rechnungs- und Lieferadresse hinzuzufügen, so dass, wenn der Benutzer dies in der Zukunft ändert, es für diese spezielle Bestellung nicht ändert.

+0

+1: Ausgezeichneter praktischer Rat bezüglich der Verantwortlichkeit. –

+0

Ich gehe davon aus, dass die unveränderlichen Teile seiner Daten, wie zum Beispiel ein Archiv von Quittungen, durch die nicht gezeigte "PriceSheet" -Tabelle gemacht werden. Ich würde behaupten, dass diese eingefrorenen Informationen an zufälligen anderen nicht konsolidierten Orten angehängt werden ist eine schlechte Übung. Es erzeugt Update-Anomalien, die vermieden werden sollten. –

+0

@ Russ danke. @Evan Carroll wie für die Preisblätter sind sie eine Art von generiert als eine Funktion der Nachfrage, so dass sie nicht genau eingefroren sind, sondern eher flüssig, wenn überhaupt. Dann wieder - es ist eine interessante Überlegung.Wenn Sie einen Link oder zwei werfen können, die sich auf das Thema ausdehnt, würde ich das schätzen. –

0

Nein, das Design ist gut genug. Außer dass ein Item kein OrderedItem haben könnte. (Zum Beispiel könnte ein brandneues Produkt, das in den Katalog gelegt wurde, nicht bestellt worden sein) Das gleiche könnte auch für die Bestellung gelten (z. B. eine Bestellung wurde getätigt, aber der Kunde hat die Einzelheiten der Bestellung nicht entschieden), aber es ist weniger wahrscheinlich.

+0

Ich meinte damit, dass ein Eintrag in der Items-Tabelle möglicherweise keinen Referenzeintrag aus der OrderedItems-Tabelle enthält. Während ein Eintrag in der Orders-Tabelle möglicherweise keinen Verweis aus der OrderedItems-Tabelle enthält, ist dies jedoch weniger wahrscheinlich. – shinkou

+0

@Shinkou, Ihre Situation ist möglich ... Aber können Sie erklären, wie Sie die DB dafür ändern ... –

+0

@Der König Nein, es kann nicht in der tatsächlichen DB-Implementierung erzwungen werden. (d. h. nichts in SQL kann das). Das machen wir während der Entwurfsphase. Bitte beziehen Sie sich auf die "Null durch viele" und "eins durch viele" Vorkommen (auch synchronisiert als Krähe Füße) hier: http://www.nearinfinity.com/blogs/lee_richardson/an_entity_relationship_diagram_example.html – shinkou

0

Es sieht übrigens gut aus, Sie können Ihre Tabellen auch mit der Beispieldatenbank Northwind vergleichen, die mit MS Office geliefert wird und auch einfach aus dem Internet heruntergeladen werden kann. http://www.learn-sql-tutorial.com/Images/relationships.gif

http://msdn.microsoft.com/en-us/library/cc161164.aspx

http://www.microsoft.com/downloadS/details.aspx?FamilyID=c6661372-8dbe-422b-8676-c632d66c529c&displaylang=en

+0

danke, ich wusste, dass ich nicht die erste Person war, die so etwas tat. –

Verwandte Themen