Wie werden Produkte gespeichert und abgefragt, deren Preis von komplexen Bedingungen abhängt?

7

Ich habe mich nicht für eine Datenbank entschieden. Ich habe Erfahrung mit MySQl und bin fasziniert von MongoDB .

Lassen Sie die Produkte Pakete von Kabelfernsehanbietern sein:

{
    name: "Virgin TV",
    price: 20
},
{

    name: "Sky",
    price: 25
}

Jedes Paket hat einige Bedingungen. Das Sky-Paket kann beispielsweise sein:

  • In den ersten drei Monaten beträgt der Preis XXX, dann wird er JJJ .
  • Wenn Sie nach 00:00 fernsehen, ist XXX-10 .
  • Wenn Sie der N-te Kunde sind, haben Sie 10% Rabatt.
  • ...

Die Bedingungen für das Virgin-Paket werden jedoch anders sein .

1) Wie lagere ich die Produkte zusammen mit all ihren Bedingungen?

Ich konnte mir nur vorstellen, für jede Bedingung so etwas wie eine gespeicherte Prozedur zu erstellen.

Es wäre schön, wenn ich nicht alle Bedingungen normalisieren müsste, um sie an ein Datenbankschema anzupassen, da neue Bedingungen leicht kommen und gehen können.

EDIT: Ich habe 2 wesentliche erkannt

  • MongoDB unterstützt anonyme Funktionen als Wert eines Feldes.
  • Map / Reduce kann eine Sammlung mithilfe einer Funktion in eine andere umwandeln

Jetzt kann unser Sky-Paket zusammen mit seinem Zustand einfach aufbewahrt werden:

db.packages.insert({
    name:      "Sky"
    price:     25,
    condition: function(object, user_input){
        time_discount = user_input.time > 0 and user_input.time < 6 ? 10 : 0;
        price = price - time_discount;
        return 6*price + 6*(price*1.2); 
    }
})

Wenn wir dann mapReduce verwenden , können wir Folgendes abfragen:

    db.packages.mapReduce(
        function(){
            emit(this.name, {...some fields..., annual_price: this.cond(this, user_input)});
        },
        function(key, values) {
            return values;
        },
        {out: "tempCollection"}
    ).find()

Ich bin nicht zufrieden mit der Tatsache, dass die mapReduce-Ausgabe ein Objekt ist, das die transformierten Werte in einem einzelnen Schlüssel mit dem Namen speichert "value". Gibt es eine andere Möglichkeit, eine Sammlung als MapReduce zu transformieren?

------- Veraltet ------

MongoDB hat serverseitige Funktionen, deren Definition vermutlich Folgendes aussagen kann:

db.system.js.save( { _id : "sky_annual_price" , value : function(price, user_input){
    time_discount = user_input.time > 0 and user_input.time < 6 ? 10 : 0;
    price = price - time_discount;
    return 6*price + 6*(price*1.2); 
}});

für das obige Sky-Beispiel.

Ja, theoretisch sieht es gut aus, aber wie kann dies in einer Abfrage verwendet werden?

------- Ende veraltet ------


2) Wie frage ich solche Informationen ab, damit ich nach dem Jahrespreis sortieren kann?

Ideen zu 1) oder 2) sind willkommen. Ich habe viel Zeit verbracht, aber ich kann das nicht herausfinden.

antitoxisch
quelle

Antworten:

5

Lesen Sie Kapitel 3 von

Das Data Model Resource Book Volume 1 von Silverston

Es hat ein Preismodell, das sehr flexibel ist

Eine sehr kurze Zusammenfassung:

Es ist ein bisschen kompliziert ...

(*) bedeutet, dass diese Spalte auf eine andere Tabelle verweist

PriceComponent

id
fromDate
thruDate null
price null
percent null
geographicBoundary* [pizza costs more outside of city]
partyType* [surcharge to seniors]
productCategory* [discount for CRT monitors]
quantityBreak* [discount for high volume]
orderValue* [discount for big order]
saleType* [surcharge for retail]
currency* [discount for Canadians]
productFeature* 
product*

BasePrice : PriceComponent

DiscountComponent : PriceComponent

SurchargeComponent : PriceComponnent

ManufacturersSuggestedRetailPrice : PriceComponent

Charge : PriceComponent

OneTimeCharge : Charge

RecurringCharge : Charge

UtilizationCharge : Charge

Der Preis von etwas ist also eine Reihe von PriceComponents, die entweder ein tatsächlicher Preisbetrag oder ein Prozentsatz sein können. Sie können eine Komponente des Endpreises basierend auf dem geografischen Standort, der Art des Verkaufs (Einzelhandel oder Großhandel), dem Wert der Bestellung usw. festlegen.

Neil McGuigan
quelle