Ich habe eine Liste von Produkten. Jeder von ihnen wird von N Anbietern angeboten.
Jeder Anbieter bietet uns einen Preis für einen bestimmten Termin an. Dieser Preis gilt so lange, bis dieser Anbieter einen neuen Preis festlegt. In diesem Fall gibt der Anbieter den neuen Preis mit einem neuen Datum an.
Der MySQL-Tabellenheader sieht derzeit folgendermaßen aus:
provider_id, product_id, price, date_price_effective
Jeden zweiten Tag erstellen wir eine Liste der Produkte / Preise, die für den aktuellen Tag gültig sind. Für jedes Produkt enthält die Liste eine sortierte Liste der Anbieter, die dieses bestimmte Produkt haben. Auf diese Weise können wir bestimmte Produkte bei demjenigen bestellen, der gerade den besten Preis anbietet.
Um die effektiven Preise zu erhalten, habe ich eine SQL-Anweisung, die alle Zeilen zurückgibt, die haben date_price_effective >= NOW()
. Diese Ergebnismenge wird mit einem Ruby-Skript verarbeitet, das die Sortierung und Filterung vornimmt, die erforderlich sind, um eine Datei zu erhalten, die wie folgt aussieht:
product_id_1,provider_1,provider_3,provider8,provider_10...
product_id_2,provider_3,provider_2,provider1,provider_10...
Für unsere Zwecke funktioniert dies einwandfrei, aber ich habe immer noch das Gefühl, dass eine SQL-Tabelle wahrscheinlich nicht der beste Weg ist, um diese Art von Informationen zu speichern. Ich habe das Gefühl, dass diese Art von Problem auf andere kreativere Weise gelöst wurde.
Gibt es eine bessere Möglichkeit zum Speichern dieser Informationen als in SQL? Oder gibt es bei Verwendung von SQL einen besseren Ansatz als den, den ich verwende?
Antworten:
Ich empfehle, das Buch "Zeitorientierte Entwicklung" zu lesen, wenn Sie Fragen haben, die von der Zeit abhängen (z. B. "Was war der Preis für X am Datum D?" Oder "Welche Kuh befand sich am Datum E?") Datenbankanwendungen in SQL. " Während dieses Buch vergriffen ist, hat der Autor das PDF des Buches sowie die dazugehörige CD freundlicherweise auf seiner Website zur Verfügung gestellt.
http://www.cs.arizona.edu/~rts/publications.html (suchen Sie den ersten Artikel unter "books").
Eine kurze Online-Einführung finden Sie unter:
quelle
Ich würde das Datum des Inkrafttretens auf jeden Fall in der Datenbank speichern. Schließlich ist es wahrscheinlich, dass die Leute in der Lage sein werden, Abfragen durchzuführen, um zu sehen, wie sich der Preis im Laufe der Zeit geändert hat, oder um Ungereimtheiten in Aufträgen mit der historischen Produktpreistabelle abzugleichen. Abhängig von der Art der von Ihnen ausgeführten Abfragen und der Häufigkeit von Preisänderungen kann es sinnvoll sein, separate Tabellen für den aktuellen Preis und die historischen Preise zu haben.
In den meisten Systemen, in denen Preise gespeichert werden, ist zusätzlich zum Datum des Inkrafttretens eine Spalte mit dem Verfallsdatum erforderlich, um leichter feststellen zu können, welcher Preis derzeit gültig ist, da Sie nicht in der vorherigen oder nächsten Zeile nachsehen müssen herauszufinden, welcher Preis zu einem bestimmten Zeitpunkt gültig war. Ich
NOW() >= date_price_effective
weiß nicht genau, was Ihr Zustand tut - vermutlich liefert er den aktuellen Kurs zusammen mit allen früheren historischen Kursen, die mir merkwürdig vorkommen. Ich würde denken, dass der "effektive Preis" der aktuelle Preis ist, der durch so etwas wie definiert wirdNOW() BETWEEN date_price_effective AND date_price_expired
Ich bin mir auch nicht sicher, wie Ihre Datei aussehen soll. Mir ist nicht klar, was -
provider_1
die provider_id = 1 Preis darstellt? - oder wie Sie die Anbieterdaten bestellen. Warum wirdprovider_1
zuerst fürproduct_id_1
und drittens für angezeigtproduct_id_2
.quelle
Wenn ich Ihre Problemstellung richtig verstehe, benötigen Sie eine Möglichkeit, mit Generationsdaten umzugehen (dh, die Tabelle enthält mehrere Zeilen für jedes Paar provider_id / product_id, von denen jede datumsabhängig ist). In diesem Fall suchen Sie nach dem neuesten Preis für ein Produkt mit einem Wert von date_price_effective, der kleiner oder gleich dem heutigen Wert ist. Diese Art von Situation ist mit einer SQL-Unterauswahl einfach zu handhaben.
Ein Preis ist gültig, solange er den größten Wert für date_price_effective hat, der kleiner oder gleich dem Datum ist, an dem die Abfrage ausgeführt wird. Ein date_price_effective-Wert, der größer als heute ist, ist ein zukünftiges Gültigkeitsdatum. Der oben aufgeführte Code gibt die Zeilendaten für jedes Anbieter-ID / Produkt-ID-Paar zurück, das den Wert date_price_effective aufweist, der dem Datum der Ausführung der Abfrage am nächsten, jedoch nicht später liegt. Die Lösung stuft die Preise automatisch in effektive Datumsbereiche ein. Der Primärschlüssel für diese Tabelle wäre das Triple {provider_id, product_id, date_price_effective};
quelle