我被要求为存储网站制作一个模块,该网站将显示用户存储空间。
服务器上有一个应用程序可以完成所有这些并且有一个数据库,因此程序员告诉我,只要原始数据库发生更改,他就可以更新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个月前有多少产品
所以我需要建议如何设计这样的数据库,这也将提高性能。我真的需要“两桌”结构,还是可以选择一个?
答案 0 :(得分:1)
我可以向你保证,这位开发人员并不讨厌你。我还可以向您保证,开发人员已经为您提供了构建有效表所需的所有事实,就像我使用您给我的事实一样。你必须假设一些事实和公式:
事实:鸡肉和盒子的重量相同的唯一方法是鸡肉放在盒子里面,因此盒子在空的时候重量为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
是主键