您应该如何处理单个产品的多个价格数据?

时间:2009-02-17 17:42:13

标签: sql database-design

我的数据库中的每个产品可以至少有三种,有时是四种或五种不同的价格,显示哪种产品是基于几个因素。我该如何尝试解决这种情况?

每种产品都有以下价格:

  • 定价(MSRP)
  • 成本(我们付出的代价)
  • 零售价 - 显示在“主要”网站
  • 政府价格(我们的主要客户是美国政府) - 仅显示在我们的政府子网
  • 促销价(有效期为1个月,但每月延长) - 仅显示在我们的政府子域
  • BPA价格(BPAs的特价) - 未显示但载入政府网站

列表价格在供应商的季度数据文件中提供,并保存在Products表中,因为它是产品实体的有限部分。我该如何处理其他价格呢?

我认为最好的(仅限?)行动方案是有一个单独的表格,其中包含不同的价格结构以及SaleStartDateSaleEndDate列,我可以查看是否或不显示促销价。事实上,我不确定是否有其他办法可以解决这个问题。

此外,我需要复制一份(不同的价格,但成本相同),因为我们公司为与我们处于同一业务的不同公司进行处理(所有工作,真的);产品相同但客户/订单/具体价格不同。当前的实现有一个重复的数据库,重复的一切(与代码相同),我想避免这样的瘟疫,所以我想找到一种方法来抽象出常见的东西。

编辑(2/17/2009 @ 12:57 PM):除了定价之外,价格都是根据成本计算的,但并不总是那么容易;有时项目需要手动更改其价格而与保证金无关,但这可以通过Excel手动处理,每季度(3个月)只能处理一次;当数据加载到数据库中时,价格是有限的,直到下一季度才会改变; “销售”价格永远是永久性的,但它会到期(不是在我们的网站上,而是在GSA Advantage等几个政府网站上),需要延长;它不会改变,但它会延长。销售价格只是让我们自己的网站与GSA Advantage同步,所以如果政府客户访问我们的网站,他们会看到与Advantage相同的定价。

RE:另一家公司,这可能是一种可行的方式,尽管多次完成所有事情会非常烦人;产品完全相同,成本完全相同(我们基本上为他们做了一切,它只是名义上的另一家公司,而且他们的客户与我们不同),但他们的价格使用与我们不同的标价。其他一切都是相同的,这就是为什么我希望将产品信息之类的东西保存在一个表中,然后将差异保存在不同的表中。当前系统很乱,主要是因为一切(数据库,代码文件,图像,所有内容)都是重复的,因此重构我们网站中的代码需要对其他网站进行相同的更改。

编辑(2/17/2009 @ 4:52 PM):到目前为止一些非常好的想法。其中一个问题是,除了报告目的和参考之外,只有一个价格列是“真正的”。例如,政府价格始终显示给政府客户,但如果当前日期在销售日期期间下降(“销售”定价特定于政府客户),则显示销售价格。如果客户订购BPA(这将由我们的订单处理系统和/或用户手动覆盖确定),则价格自动为BPA价格。可能会显示清单价格以显示您获得的折扣,这是报告所必需的,但没有其他内容。

另外,我不确定事情将如何正常化以进行更新。现在,我只是递交了一个带有新定价的电子表格并告诉他们更新数据库(因为他们都在产品表中);我这样做是基于产品的SKU,因为ID只是内部的,所有相关的表都是通过SKU链接的。使用单独的价格表会变得更加笨重,尽管我仍然可以使用SKU作为参考(它将成为产品的唯一索引),但还需要手动完成更多。

3 个答案:

答案 0 :(得分:3)

  • 我的第一个问题是,可以全部 价格从其中一个计算 价格?如果是,则规则是 同样的产品,我们在一个 更容易的地方。

  • 任何价格都会发生变化 独立于其他价格?您 已经暗示销售价格是 有效期为1个月,然后延长 - 价格是否保持不变或 它改变了吗?如果它保持不变, 这比改变更容易。

您的产品价格设定了开始日期和结束日期,因为这对历史价格报告至关重要。

编辑:

我原本以为你可以根据成本价格使用persisted computed columns作为其他价格,但由于价格可以手动调整,所以这不是一个选项(我不相信你可以覆盖pcc值)。您可以编写存储过程以根据成本价格将初始价格插入PRICE表。

根据目前为止的信息,我认为您最好的选择是在PRICE表中使用单独的PRODUCT表,在PRICE表中使用product_id外键引用PRODUCT表的主键ID -

PRODUCT表

id | name | image | description | etc... 

PRICE表

id | product_id | list_price | cost_price | retail_price | gov_price | sale_price | bpa_price | start_date | end_date

谨慎的做法是在您的定价上设置开始日期和结束日期字段,因为您不仅可以历史地报告价格,还可以使用未来价格填充表格。

使用上述结构,现在当您进行价格更改时,您需要在产品的PRICE表中插入新记录。在开始日期和结束日期设置索引,然后您将按如下方式查询产品和价格

SELECT 
product.name,
price.list_price,
price.cost_price,
price.retail_price /*, ETC... */
FROM
product
INNER JOIN
price
ON product.id = price.product_id
WHERE
price.start_date <= @date
AND price.end_date >= @date

您可以进一步规范化此设计,并且还有一个PRICE_TYPE表。但是,采用这种方法时要注意的是,如果您想获得产品的全套价格,那么WHERE子句将应用于每种产品的6条记录。

为了处理其他公司的情况,只要有适当的权限和限制,我看到很少 *将问题存储在同一个数据库中的问题。你说他们使用不同的加价 - 你指的是他们的价格吗?如果是这样,您可以使用价格表中的company_id处理此问题。可以通过存储过程控制对数据的访问,并通过事务更新价格。

*这取决于公司之间的工作紧密程度。是否允许共享资源?

(N.B。我假设您的目标数据库是SQL Server,但我认为其他平台的逻辑类似)。

答案 1 :(得分:1)

MS SQLOracle

创建表prices

CREATE TABLE prices (product, pricetype, price, startdate, enddate)

查询:

SELECT product, price, pricetype
FROM (
  SELECT products.* ,
         prices.*
         ROW_NUMBER() OVER (PARTITION BY product, pricetype ORDER BY startdate) rn
  FROM products, prices
  WHERE prices.product = product.id
     AND startdate <= @date
 )
WHERE rn = 1
AND enddate >= @date

这将为您提供给定@date

的所有类型的实际价格

答案 2 :(得分:0)

从我的角度来看,我会有一个 项目表:具有定价(MSRP),成本,零售价,政府价格和BPA价格

并且

销售表:包括销售价格,开始日期,结束日期以及显然是项目表的链接。

至于其他公司的东西,我认为你会希望它是一个单独的数据库。我不想将我的网站数据与其他网站混合使用。即使它们是重复的。我知道总是要做两次相同的事情是一种痛苦,但看起来它们是独立的系统,应该这样对待。

只是我的两分钱。