基于日期的mysql结构

时间:2014-05-23 17:54:56

标签: mysql database database-design

我被要求为存储网站制作一个模块,该网站将显示用户存储空间。

服务器上有一个应用程序可以完成所有这些并且有一个数据库,因此程序员告诉我,只要原始数据库发生更改,他就可以更新mysql数据库。

他给了我这样一张桌子

Balance, date - 13.05.2014

    Warehouse:  21              60,000.00

    №   Name                Quantity    Unit (weight)   Netto

    1   Chicken (15 kg)     4,000   Box (15 kg.)        60,000.00

    Total:      4,000       60,000.00

并且告诉我他将更新数据库,并发送添加或减去数量的数据。

在我看来,这将是这样的

INSERT INTO table VALUES (1000, 0, datetime())

其中第一个值是数量增加,第二个减去第三个日期。

这是因为客户需要查看他昨天或3个月前有多少产品

所以我需要建议如何设计这样的数据库,这也将提高性能。我真的需要“两桌”结构,还是可以选择一个?

1 个答案:

答案 0 :(得分:1)

我可以向你保证,这位开发人员并不讨厌你。我还可以向您保证,开发人员已经为您提供了构建有效表所需的所有事实,就像我使用您给我的事实一样。你必须假设一些事实和公式:

  1. 项目的重量等于盒子的重量。
  2. 由于Box和项目权重现在相同,因此项目的大小无关紧要。
  3. 总重量=单位重量*数量
  4. 事实:鸡肉和盒子的重量相同的唯一方法是鸡肉放在盒子里面,因此盒子在空的时候重量为0。 FACT 2 :知道盒子的重量为零决定了要使用的计算。由于盒子的重量为零,因此开发人员使用直线法计算净总量,因为盒子没有干扰。
    FACT 3 :您可以安全地使用上面的公式来计算任何数量的任何重量。如果盒子有重量,则公式为:

    总重量=(单位重量*数量)+(数量* WeightOfEmptyBox),假设只有1个项目适合方框。

    答案

    CREATE TABLE WeightOnHand
    (
        ProductID INT CONSTRAINT pk_products_pid PRIMARY KEY,
        ProductName VARCHAR(25),
        UnitWeight FLOAT,
        Quantity SMALLINT,
        NetTotalWeight AS Quantity * UnitWeight,
        OrderDate As Date
    );
    GO
    

    另请注意,此解决方案与日期无关。日期是开发人员可以向您提供显示信息并进行更新的唯一方式,如下所示:

    UPDATE WeightOnHand
    SET Quantity= 2500
    WHERE ProductID = 1 OR OrderDate >='2014-05-23'
    

    我现在已经将鸡的数量设置为2500.您的NetTotal现在将是37,500

    更新只有每天运行报告,或者您希望每天存储新数量时,日期项才可用。为此,您需要更新OrderDate Daily,然后使用:

    SELECT ProductName, Quantity, NetTotalWeight
    WHERE OrderDate >=5/23/2014 AND OrderDate <= 5/24/2014
    

    pk_products_pid是主键