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.
quelle