数据库设计问题,每个客户任意价格

时间:2015-09-10 03:24:37

标签: database-design

我在市场网站上工作。卖家和买家可以注册并进行交易。

我遇到的困难是,我需要允许卖家为每位客户设置不同的商品价格

例如,买家A看到香蕉的价格是5美元,而买家B必须支付6美元来获得相同的商品。

我可以选择我想要的任何数据库。但是如何实现呢?

假设我有100,000件商品和10,000名买家。

4 个答案:

答案 0 :(得分:2)

这很大程度上取决于您的业务规则以及您如何确定客户报价的实际价格。因此,第一项业务是整理您的业务规则。

我大部分时间都在做过这样的事情,但大致都是这样做的。每个项目都有默认价格。这与项目的其他信息一起存储在产品表中。下一个客户通常会根据某些业务规则或关系获得折扣。这些折扣往往是供应商而非产品。大多数客户都会获得默认值,除非他们符合业务规则。所以你需要一个折扣表,其中包含vendorID和customerid以及折扣(或者加价,但通常默认价格是收取的最高价格)。

接下来,您需要一张表来存储特定订单的报价。此表(价格报价表)是您可以进行特定的单个价格调整以及对大多数项目应用默认或折扣调整的位置。请注意,您不需要为每个产品 - 客户组合执行此操作,仅针对实际报价给客户的组合。

最后,在某些时候,您进行销售,报价成为订单。该数据应存储在单独的订单表中。

答案 1 :(得分:1)

而不是为每个买家设置单独的价格,设置一个价格,让每个买家都有一个"标记"当买方看到价格或进行交易时,它会被添加到价格中......这样您就不必跟踪每个商品的10,000个价格流,只需1个价格,然后在客户端处理标记...您只需为每位买家提供一次标记,然后让前端根据该值调整价格。在服务器端,你只有一个普通的双重拍卖市场,所以你不必重新发明轮子。

答案 2 :(得分:1)

首先,每个卖家销售的每件商品的定义和默认价格:

FizzResource

然后买家,卖家和物品之间的关系。

create table ItemPrices(
    SellerID      int not null,
    ItemID        int not null,
    DefaultPrice  currency not null,
    constraint PK_ItemPrices primary key( SellerID, ItemID ),
    constraint FK_ItemPrices_Seller foreign key( SellerID )
        references Sellers( ID ),
    constraint FK_ItemPrices_Item foreign key( ItemID )
        references Items( ID )
);

显示特定卖家销售的特定商品的价格:

create table PriceByBuyer(
    SellerID      int not null,
    BuyerID       int not null,
    ItemID        int not null,
    NewPrice      currency not null,
    constraint PK_PriceByBuyer primary key( SellerID, BuyerID, ItemID ),
    constraint FK_PriceByBuyer_Seller foreign key( SellerID )
        references Sellers( ID ),
    constraint FK_PriceByBuyer_Buyer foreign key( BuyerID )
        references Buyers( ID ),
);

但如果PriceByBuyer中有针对特定买家的该项目和卖家的条目,那么这是要显示的价格而不是默认价格:

select  ip.SellerID, ip.ItemID, ip.DefaultPrice as Price
from    ItemPrices ip
where   ip.Seller = :ThisSeller
    and ip.Item   = :ThisItem;

如果PriceByBuyer中没有指定商品,卖家和买家的条目,则select ip.SellerID, ip.ItemID, coalesce( pbb.NewPrice, ip.DefaultPrice ) as Price from ItemPrices ip left join PriceByBuyer pbb on pbb.SellerID = ip.SellerID and pbb.ItemID = ip.ItemID and pbb.BuyerID = :ThisBuyer where ip.Seller = :ThisSeller and ip.Item = :ThisItem; 将为NULL,并且合并将返回默认价格。如果有条目,那么pbb.NewPrice为NULL,这将是显示的价格。

答案 3 :(得分:0)

我想到的第一件事是mysql。 所以我设置了一个价格表,其中包括" goods_id"," buyer_id"," price"作为领域。 问题是表格太大(100,000 * 10,000条记录),加入操作可能会很慢。

如果我为每个客户设置价格表,并将字段缩减为" goods_id"和"价格"。 现在我可以快速阅读,但写作仍然存在问题。 当卖家修改价格时,需要更新所有10,000个表。 我可以异步更新价格,但卖家有时会想立即提高价格。

如果我只保存mysql的默认价格,那么"价格"只是一个商品表领域。 并且我将所有特殊价格要求保存到某些nosql中,其中一个键包含" goods_id"和" buyer_id"。 我的价格逻辑是尝试搜索nosql中的价格。如果没有找到匹配,我使用默认价格。 然而,通过这样做,我失去了按价格分类项目的功能。哪个让我生气。

有更好的方法吗?