4

几乎所有 POS 系统都会在销售时将物品的价格直接记录到交易表中,因为该价格可能会在以后发生变化,但它的销售价格应该保持不变。

我想知道您将如何设置保留价格变化历史的定价表,以便您可以根据商品及其出售时间将交易与该表相关联以获得正确的价格?

我认为任何曾经使用过 POS 系统的人都会理解我在这里所说的,但如果我的问题不清楚,请告诉我,我会尝试更好地解释。

我没有标记特定的数据库,因为这个问题显然不是特定于特定的,但因为我知道这是我将被问到的第一个问题:SQL Server 2008。

编辑:

这是我刚刚想到的一个解决方案,我很想得到一些反馈...

我想我可以有一个价格表,其中包含如下字段:PriceId、ItemId、Price、Date

PriceId 将是一个自动编号,并且 ItemId 与 Items 表相关。现在,我不会将实际价格保存到交易表中,而是保存给定项目的最新 PriceId。

想法?

4

3 回答 3

4

我真的看不出这样做的理由。您正在为几乎所有分析目的和大多数查询添加额外的连接,这将影响应用程序的速度。

回答您的问题虽然最简单的方法是创建定价表,就好像您正在创建一个临时数据库一样。

因此,做一些假设,您的定价表可能包含以下列:

id int, pk
product_id, fk into products
price_start_date date
price_end_date date
price number(x, 2)

假设您的“订单”表具有下订单/发布订单的日期等,无论您使用什么来确定价格,每个查询来确定价格都会变成

select price
  from pricing p
  join orders o
    on o.order_Date between p.price_start_date and p.price_end_date

但是,正如我所说,我不会这样做。我能想到的唯一障碍是,在订单表中而不是在单独的表中包含历史价格是它使历史价格分析在 DB 上稍微重一些。你不会经常这样做,也不想知道有多少单位被售出,因此无论如何都需要使用订单表,所以我认为这不会有很大的不同。

我认为这是一个非常轻微的非规范化数据库绝对是积极而不是消极的情况之一。


好的,关于您的编辑,与我的建议几乎没有什么不同。我将假设您的表是唯一的itemid 并且 date(不要将其用作实际的列名)否则日期可以在您的“项目”表中同样保存。

但是,这确实意味着每当您向交易表中添加一些东西时,您都必须使用聚合查询来计算出每件商品的最新价格。我的建议使更新价格更加困难,但更容易计算价格。由于您计算商品价格的频率比更新价格的频率高,因此我个人会在我建议的地方采取性能打击。

于 2012-08-05T18:42:15.397 回答
0

我在上一个项目中遇到了这个问题,我决定使用价格表来保留历史价格,因为客户想验证他的供应商多久更改一次价格等。对于许多报告,我发现自己做了一个额外的加入只是为了检索感觉很麻烦的当前价格,所以我最终得到了这样的表。

product:
    name ...
    quantity ...
    ...
    priceId ... (foreign key to lastest price on prices table)
    price ... (the last updated price, to avoid the prices join)
于 2017-05-08T22:13:35.750 回答
0

您必须根据自己的情况进行调整,但在我的情况下,我有一个费用类型的查找表,这就是我将费用更新为新价格并保留原始价格以供参考的方式。此处视图的开销仅与您查询它以生成发票的频率有关。这是我的用例。

您可以在此处使用 vwCharge 获取最新定价列表。当使用 update_charge_rate() 时,它会添加一个新的更新日期,查询 vwCharge 只会显示最近的。

分隔符设置为 //

查找表:

CREATE TABLE lkCharge (
  charge_id SMALLINT NOT NULL AUTO_INCREMENT,
  charge_datecreated DATE NOT NULL,
  charge_name VARCHAR(20) NOT NULL,
  charge_rate DECIMAL(10,2) NOT NULL,
  charge_islocked CHAR(1) DEFAULT 'N',
  charge_lockedby VARCHAR(255) DEFAULT NULL,
  charge_lockdate TIMESTAMP NULL,
  charge_isdeleted CHAR(1) DEFAULT 'N',
  CONSTRAINT pkChargeId PRIMARY KEY(charge_id, charge_datecreated)
) ENGINE=InnoDB DEFAULT CHARSET=utf8//

风景:

CREATE VIEW vwCharge AS
  SELECT
    charge_id,
    charge_datecreated,
    charge_name,
    charge_rate,
    charge_islocked,
    charge_lockedby,
    charge_lockdate,
    charge_isdeleted
  FROM lkCharge AS o
  WHERE o.charge_id=o.charge_id AND charge_datecreated=(
    SELECT MAX(charge_datecreated)
      FROM lkCharge AS i
        WHERE i.charge_id=o.charge_id
  )//

更新程序:

CREATE PROCEDURE update_charge_rate(
  IN p_charge_id SMALLINT,
  IN p_new_charge_rate DECIMAL(10,2)
)
BEGIN
  DECLARE _name VARCHAR(20);

  SELECT charge_name INTO _name
    FROM vwCharge WHERE charge_id=p_charge_id;

  INSERT INTO lkCharge(charge_id, charge_datecreated, charge_name, charge_rate)
    VALUES(p_charge_id, UTC_DATE(), _name, p_new_charge_rate);

  SELECT LAST_INSERT_ID();
END//
于 2017-06-08T02:52:55.180 回答