Tôi chưa quyết định về cơ sở dữ liệu. Tôi có kinh nghiệm với MySQl và tôi bị thu hút bởi MongoDB .
Hãy để các sản phẩm là gói của các nhà cung cấp truyền hình cáp:
{
name: "Virgin TV",
price: 20
},
{
name: "Sky",
price: 25
}
Mỗi gói đi kèm với một số điều kiện. Các gói Sky ví dụ có thể là:
- Ba tháng đầu tiên giá là XXX sau đó trở thành YYY .
- Nếu bạn xem TV sau 00:00 là XXX-10 .
- Nếu bạn là khách hàng thứ N, bạn được giảm giá 10%.
- ...
Nhưng các điều kiện cho gói Virgin sẽ khác nhau .
1) Làm thế nào để tôi thực sự lưu trữ các sản phẩm cùng với tất cả các điều kiện của chúng?
Tôi chỉ có thể nghĩ đến việc tạo ra một cái gì đó như thủ tục được lưu trữ cho mọi điều kiện khác nhau?
Sẽ thật tuyệt nếu tôi không phải bình thường hóa tất cả các điều kiện để phù hợp với lược đồ cơ sở dữ liệu vì các điều kiện mới có thể dễ dàng đến và đi.
EDIT: Tôi đã nhận ra 2 điều cần thiết
- MongoDB hỗ trợ các hàm ẩn danh như một giá trị của một trường.
- Map / Giảm có thể chuyển đổi một bộ sưu tập sang một bộ khác bằng cách sử dụng một chức năng
Bây giờ gói Sky của chúng tôi cùng với điều kiện của nó có thể được lưu trữ dễ dàng:
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);
}
})
Sau đó, nếu chúng ta sử dụng mapReduce, chúng ta có thể truy vấn như:
db.packages.mapReduce(
function(){
emit(this.name, {...some fields..., annual_price: this.cond(this, user_input)});
},
function(key, values) {
return values;
},
{out: "tempCollection"}
).find()
Tôi không hài lòng với thực tế đầu ra mapReduce là một đối tượng lưu trữ các giá trị được chuyển đổi trong một khóa có tên "value"
. Có cách nào khác để chuyển đổi một bộ sưu tập khác ngoài MapReduce không?
------- Đã lỗi thời ------
MongoDB có các chức năng phía máy chủ mà định nghĩa mà tôi cho là có thể nói một cái gì đó như:
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);
}});
cho ví dụ Sky ở trên.
Vâng, trên lý thuyết có vẻ tốt nhưng làm thế nào điều này có thể được sử dụng trong một truy vấn?
------- Kết thúc lỗi thời ------
2) Làm cách nào để truy vấn thông tin đó để tôi có thể sắp xếp theo giá hàng năm?
Mọi ý tưởng trên cả 1) hoặc 2) đều được chào đón. Tôi đã dành thời gian đáng kể nhưng tôi không thể tìm ra điều đó.