Speichern Sie alle einzelnen Details für jeden Artikel, wie Sie sie später normalerweise benötigen (für statistische / Informationszwecke oder aus anderen Gründen). Sie müssen sicherstellen, dass Sie immer der gleichen Berechnungslogik folgen, um den Gesamtverkaufspreis zu erhalten. Also müssen Sie vielleicht Währungen, Rabatt, Preiseinheit, etc. zusammen mit diesen speichern. Hier einige weitere Punkte zu beachten:
Wenn Sie den einzelnen Artikelpreis später ausgeben möchten, benötigen Sie die einzelnen Artikeldaten.
Speichern Sie den Gesamtpreis nicht zusammen mit einzelnen Artikeldaten, da Sie beide immer synchron halten müssen. Sie werden einige Monate / Jahre später verwirrt, über welche von beiden für Ihre Berechnungen zu verwenden.
Aggregieren Sie Ihre Daten, wenn Sie sie in einem Data Warehouse verwenden und die Details nicht benötigen.
Dies ist das Problem 3. Normalform .
Option 1 ist in der 3. Normalform. Es gibt keine abgeleiteten Daten. Die Berechnung muss für jede Abfrage durchgeführt werden. Aus diesem Grund können Updates in jedem Feld durchgeführt werden, ohne dass etwas kaputt geht.
Option 2 bricht die 3. Normalform ab. Es speichert abgeleitete Daten. Berechnungen werden nicht zur Abfragezeit durchgeführt, wodurch sie viel schneller werden. Ein Update, das die Berechnung nicht erneut durchführt, führt jedoch zu inkonsistenten Daten. Dies wird als "Update-Anomalie" bezeichnet. Ein Update führt dazu, dass das abgeleitete Datenfeld inkonsistent ist.
Außerdem kann es - abhängig von der Berechnung - unmöglich sein, zu entscheiden, welche Felder sich sollten ändern, wenn die abgeleiteten Daten geändert werden müssen.
Ich würde sagen, dass Sie immer Kosten und Preise als separate Spalten speichern UND die Summe speichern. Es wird eine Zeit geben, in der Sie diejenigen brauchen, die ausgebrochen sind (Berichterstattung, Rechnungsstellung), die Sie bereuen werden.
Die Frage wird wirklich, sollten Sie auch die berechneten Werte speichern. das hängt wirklich von den Umständen der Anwendung ab (wie viele Zeilen, wie viele Transaktionen, etc.). Wenn es eine kleine - mittlere Anwendung ist, wird es wahrscheinlich nicht für die Leistung wichtig, so dass es nur eine Frage von anderen Faktoren ist.
Wenn die Formel für den Gesamtbetrag komplizierter wird (z. B. Steuern, Rabatte usw.), möchten Sie möglicherweise die Summe speichern. Andernfalls könnte es sich als extrem schwierig erweisen, diese Logik in anderen Bereichen zu replizieren.
Ich speichere persönlich immer auch den Gesamtbetrag. Ich finde nur, dass die Kosten für die zusätzliche Datenbankspalte immer durch die Summe an anderen Stellen aufgewogen werden.
Ich würde die Kosten für einen Artikel und den Verkaufspreis pro Artikel speichern. Wenn Sie nur die Summen speichern, wird es Ihnen schwer fallen, Ihre Werte neu zu berechnen, wenn sich die Preise ändern. Stellen Sie sich vor, Sie gewähren einen saisonalen Rabatt auf einige Ihrer Artikel, wenden bei einigen Artikeln unterschiedliche Steuern an (vielleicht sogar unterschiedliche, abhängig vom Herkunftsland des Kunden) oder gewähren registrierten Kunden niedrigere Preise - Sie müssen diese Preise basierend auf den Verkäufen berechnen Preis eines Artikels, die Summen sind in diesem Fall nutzlos.
Und wenn Sie wirklich die Summen brauchen, können Sie sie jederzeit einfach mit einfachen DB-Abfragen berechnen, unter Berücksichtigung aller Rabatte, etc. etc.
IMHO speichern Kosten und Verkäufe pro Artikel. Wenn die Ergebnisse wie Summen angezeigt werden sollen, führen Sie sie entweder in der Abfrage aus oder erstellen Sie eine temporäre Tabelle oder eine gespeicherte Prozedur mit den Berechnungen. Normalerweise führe ich diese Berechnungen jedoch im Code durch (PHP oder JAVA in meinem Fall). Wenn es nur für Berichtszwecke ist, ist es manchmal in Ordnung, die Summen zu speichern, um die Berechnungen zu beschleunigen (und einige Fehlberechnungen in Ihrem Code zu verhindern).
Ich würde die Summen nur speichern, wenn ich ein ernsthaftes Berichtsproblem habe, bei dem viele Abfragen den Gesamtwert einer großen Menge von Datensätzen erfordern (wenn Sie nur die Summe für eine kleine Menge erhalten, berechnen Sie sie bei Bedarf, wenn sie OK ist ).
Wenn Sie die Summen speichern, benötigen Sie Trigger, um sicherzustellen, dass Aktualisierungen, Löschungen und Einfügungen die Summen korrekt aktualisieren. Andernfalls sind die Daten nicht mehr synchron und nutzlos.
Es hängt davon ab, was Sie mit den Daten machen werden.
Für viele Zwecke lohnt es sich, unter jedem Artikel den Stückpreis dieses Artikels, die gekaufte Menge und den erweiterten Preis zu speichern. Der erweiterte Preis ist Menge mal Stückpreis. Ist das überflüssig? Nun ja. Verstößt es gegen eine normale Form? Nun ja. Aber es funktioniert ganz gut.
Warum speichern Sie den Preis in der Artikelzeile (Datensatz) und verlassen sich nicht nur auf dieselben Preisdaten, die in der Hauptprodukttabelle gespeichert sind? Denn wenn Sie den Preis nach diesem Verkauf ändern, möchten Sie nicht den Preis ändern, den dieser Kunde bei diesem Kauf erleidet. Warum den erweiterten Preis speichern, da dieser im laufenden Betrieb neu berechnet werden kann? Weil es einen Schritt einfacher macht, später über eine Menge von Elementen zu aggregieren (Summe oder Durchschnitt).
Wenn Sie den erweiterten Preis speichern, können Sie diese Analysewerkzeuge mit Zeigen und Klicken (siehe OLAP) für eine spätere Analyse ohne weitere Programmierung verwenden. Wenn Sie darauf zählen, den erweiterten Preis bei Bedarf erneut zu berechnen, stellen Sie möglicherweise fest, dass das Drilldown-Tool nicht intelligent genug ist, um die Multiplikation für Sie durchzuführen.
"Elemente" sind normalerweise Kinder einer größeren Arbeitseinheit. In einem Fakturierungssystem ist ein Artikel Teil einer Rechnung. In einem Hauptbuchsystem ist ein Artikel Teil einer Transaktion. Die Artikel sind nicht ausgeglichen, aber die Transaktion ist. In vielen Commerce-Systemen werden heutzutage die Fakturierungsfunktion und die Abrechnungsfunktion von der gleichen Datenbank ausgeführt, aber das geht über Ihre Frage hinaus.
Normalerweise versuche ich, meine Daten normalisiert zu halten. Dies ist ein Ort, an dem viele Experten absichtlich von den Anforderungen der reinen Normalisierung abweichen.
Tags und Links data-binding database-design