Làm thế nào để lưu trữ và truy vấn các sản phẩm giá mà phụ thuộc vào một tập hợp các điều kiện phức tạp?


7

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 đó.

Câu trả lời:


5

Kiểm tra chương 3 của

Cuốn sách Tài nguyên mô hình dữ liệu Tập 1 của Silverston

Nó có một mô hình định giá rất linh hoạt

Một bản tóm tắt rất ngắn gọn:

Nó hơi phức tạp ...

(*) có nghĩa là cột này tham chiếu bảng khác

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

Vì vậy, giá của một thứ gì đó là một tập hợp các PriceComponents, có thể là một mức giá thực tế hoặc tỷ lệ phần trăm. Bạn có thể có một thành phần của giá cuối cùng dựa trên vị trí địa lý, loại hình bán hàng (bán lẻ so với bán buôn), giá trị của đơn đặt hàng, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.