Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 您应该如何处理单个产品的多个价格的数据?_Sql_Database Design - Fatal编程技术网

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

Sql 您应该如何处理单个产品的多个价格的数据?,sql,database-design,Sql,Database Design,我数据库中的每种产品都可以有至少三种,有时甚至四到五种不同的价格,显示哪种价格取决于几个因素。我应该如何尝试解决这种情况 每种产品的价格如下: 标价管理系统更新项目 我们付多少钱都行 零售价格-显示在主站点上 政府价格我们的主要客户是美国政府-仅显示在我们的政府子菜单上 销售价格有效期为1个月,但每月延长-仅显示在我们的政府子域上 BPA价格BPA的特殊价格-未显示,但已加载到政府网站 标价在供应商的季度数据文件中提供,并保存在产品表中,因为它是产品实体的有限部分。但是我该如何处理其他价格呢 我

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

每种产品的价格如下:

标价管理系统更新项目 我们付多少钱都行 零售价格-显示在主站点上 政府价格我们的主要客户是美国政府-仅显示在我们的政府子菜单上 销售价格有效期为1个月,但每月延长-仅显示在我们的政府子域上 BPA价格BPA的特殊价格-未显示,但已加载到政府网站 标价在供应商的季度数据文件中提供,并保存在产品表中,因为它是产品实体的有限部分。但是我该如何处理其他价格呢

我只是在想最好的?操作过程是有一个单独的表,其中包含不同的价格结构以及SaleStartDate和SaleEndDate列,我可以检查这些列是否显示销售价格。事实上,我不确定还有什么其他方法来处理这个问题

此外,我需要一份不同价格的副本,但与我们公司处理所有工作的成本相同,实际上是为与我们从事相同业务的不同公司;产品相同,但客户/订单/具体价格不同。当前的实现有一个重复的数据库,所有的东西都用相同的代码重复,我想避免这种情况,就像瘟疫一样,所以我试图想出一种方法来抽象出常见的东西

编辑2/17/2009@12:57PM:除了标价,所有价格都是根据成本计算的,但并不总是那么容易;有时项目需要独立于保证金手动更改其价格,但这是通过Excel手动处理的,并且每季度仅3个月一次;当数据加载到数据库中时,价格是有限的,直到下一个季度才改变;销售价格是永久的,但它不是在我们的网站上过期,而是在一些政府网站上过期,如GSA Advantage,需要延长;当它被扩展时,它不会改变。销售价格只是为了让我们自己的网站与GSA Advantage同步,因此,如果政府客户访问我们的网站,他们将看到与Advantage相同的价格

RE:另一家公司,这可能是一条路要走,尽管每件事都要做多次会让人非常恼火;产品一模一样,成本一模一样,我们基本上为他们做了一切,这只是名义上的另一家公司,事实上他们的客户与我们不同,但他们的价格与我们的不同。其他一切都是相同的,这就是为什么我希望将产品信息等内容保存在一个表中,然后将差异保存在单独的表中。目前的系统一团糟,主要是因为所有数据库、代码文件、图像和所有内容都是重复的,因此重构我们网站中的代码需要对其他网站进行相同的更改

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

另外,我不确定规范化的东西会使更新变得多么糟糕。现在,我刚刚收到一份新定价的电子表格,并被告知更新数据库,因为它们都在产品表中;我是根据产品的SKU来做这件事的,因为ID只是内部的,所有相关的表都是通过SKU链接的。如果有单独的价格表,它会变得更加笨拙,尽管我仍然可以使用SKU作为参考,但它将是产品的唯一索引,但还需要手动执行更多操作。

在MS SQL或Oracle中:

创建一个价格表:

查询:

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
这将为您提供MS SQL或Oracle中给定@date的所有类型的实际价格:

创建一个价格表:

查询:

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的所有类型的实际价格

我的第一个问题是,所有的 价格可从下列各项之一计算: 价格?如果是,则规则为 所有产品都一样,我们处于一个 比较容易的地方

价格有变化吗 独立于其他价格?你 已经暗示销售价格是合理的 适用于 1个月,然后延长- 价格不变还是不变 它变了吗?如果它保持不变, 这比改变要容易

为产品价格设置开始和结束日期是正确的,因为这将是历史价格报告的基础

编辑:

我想你可以根据成本价使用其他价格,但由于价格可以手动调整,因此这不是一个选项,我不相信你可以覆盖p.c.c.值。您可以编写一个存储过程,根据成本价格将初始价格插入到价格表中

根据到目前为止的信息,我认为您最好的选择是从产品表中创建一个单独的价格表,并在价格表中创建一个产品id外键,该外键引用产品表的主键id-

产品表

价格表

在定价中使用开始日期和结束日期字段是明智的,因为您不仅可以报告历史价格,还可以用未来价格填充表格

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

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_类型的表。然而,采用这种方法需要记住的一点是,如果您想要获得产品的完整价格集,那么WHERE子句将应用于每个产品的6个记录

为了处理其他公司的情况,如果有适当的权限和限制,我认为在同一数据库中存储它们的价格几乎没有问题。你说他们使用不同的加价-你是指他们的价格吗?如果是这样,您可以在价格表中使用公司id来处理此问题。可以通过存储过程和通过事务更新价格来控制对数据的访问

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

注意:我假设您的目标数据库是SQL Server,但我认为其他平台的逻辑类似

我的第一个问题是,所有的 价格可从下列各项之一计算: 价格?如果是,则规则为 所有产品都一样,我们处于一个 比较容易的地方

价格有变化吗 独立于其他价格?你 已经暗示销售价格是合理的 有效期为1个月,然后延长- 价格不变还是不变 它变了吗?如果它保持不变, 这比改变要容易

为产品价格设置开始和结束日期是正确的,因为这将是历史价格报告的基础

编辑:

我想你可以根据成本价使用其他价格,但由于价格可以手动调整,因此这不是一个选项,我不相信你可以覆盖p.c.c.值。您可以编写一个存储过程,根据成本价格将初始价格插入到价格表中

根据到目前为止的信息,我认为您最好的选择是从产品表中创建一个单独的价格表,并在价格表中创建一个产品id外键,该外键引用产品表的主键id-

产品表

价格表

在定价中使用开始日期和结束日期字段是明智的,因为您不仅可以报告历史价格,还可以用未来价格填充表格

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

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_类型的表。然而,采用这种方法需要记住的一点是,如果您想要获得产品的完整价格集,那么WHERE子句将应用于每个产品的6个记录

为了处理其他公司的情况,如果有适当的权限和限制,我认为在同一数据库中存储它们的价格几乎没有问题。你说他们使用不同的加价-你是指他们的价格吗?如果是这样,您可以在价格表中使用公司id来处理此问题。可以通过存储过程和通过事务更新价格来控制对数据的访问

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


注意:我假设您的目标数据库是SQL Server,但我认为其他平台的逻辑类似。

从我的角度来看,我有一个 项目表:含标价MSRP、成本、零售价、政府价格和BPA价格

销售表:带有销售价格、开始日期、结束日期,显然还有到项目表的链接

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


只要我的两分钱。

从我的角度来看,我会有一个 项目表:含标价MSRP、成本、零售价、政府价格和BPA价格

销售表:带有销售价格、开始日期、结束日期,显然还有到项目表的链接

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


只有我的两分钱。

这并不是我想要的——我想要的更多是设计一个方案的最佳方法,该方案允许单个产品的多种价格。唯一需要日期范围才有效的价格是销售价格,其余价格是不变的,与日期无关。但它们是日期敏感的。你是说价格永远不会改变吗?您可以简单地添加一个名为Active的列来标记当前处于活动状态的价格。我仍然会有开始和结束日期,尽管我可能只会在您为所有产品添加价格的当天填写开始日期。@Wayne M-这允许每个产品有多个价格。我假设product、pricetype和startdate的组合将是prices表上的PK。更改价目表、政府等是否会在当前行中添加结束日期,并创建新记录。cont。您还可以为多对多关系添加公司字段或公司价格表,以允许多个公司共享或不共享相同的价格值。这不是我要问的——我要问更多关于设计方案的最佳方法,该方案允许单个产品的多个价格。唯一需要日期范围才有效的价格是销售价格,其余价格是不变的,与日期无关。但它们是日期敏感的。你是说价格永远不会改变吗?您可以简单地添加一个名为Active的列来标记当前处于活动状态的价格。我仍然会有开始和结束日期,尽管我可能只会在您为所有产品添加价格的当天填写开始日期。@Wayne M-这允许每个产品有多个价格。我假设product、pricetype和startdate的组合将是prices表上的PK。更改价目表、政府等是否会在当前行中添加结束日期,并创建新记录。cont。您还可以为多对多关系添加公司字段或公司价格表,以允许多个公司共享或不共享相同的价格值。嗯,我从来没有想过。。我打算在价格表中每种产品有一行,然后做一个更新。。。但是,按照你的方式来做并启用历史报告并不是一个坏主意。嗯,我从来没有想过。。我打算在价格表中每种产品有一行,然后做一个更新。。。但是,按照您的方式进行并启用历史报告并不是一个坏主意。单独的价格表是明智的-您可以使用“价格开始日期”和“价格结束日期”,并在零售价格失效时为其指定一个日期,直到该日期无限期地更改未来的结束日期,还有一个规则是关于哪些标签适用于条目。一个单独的价格表是合理的-你可以使用“价格开始日期”和“价格结束日期”,并在零售价格失效时给它一个日期,直到它在将来无限期地改变结束日期,还有一个规则是关于哪些标签适用于条目。
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