哪一个更好的规范化?

时间:2014-04-18 17:19:47

标签: sql query-optimization normalization query-performance

我不擅长规范化数据库,而且我的情况让我感到困惑。

我们需要一个具有常规功能的存储软件数据库,如:

  • 存储客户和货物
  • 存储购买发票
  • 存储销售发票
  • 获取当前库存商品数量。

我脑子里有两个选择:

1。第一个解决方案

我们有4个这样的表:

的商品:

ID: PK; ->unique id for each of wares
Name  ; ->this is clear enough ;)

客户:

ID: PK;
Name; 

发票:

ID: PK;
ID_Customer: FK;
Date;

invoices_items:

ID_Invoice: FK;
ID_Ware: FK;
Qty: quantity of ware that was bought or sold. for buying number is positive and selling number is negative

2。第二个解决方案

我们有3个这样的表:

商品客户就像第一个

发票:

ID: its not PK;
ID_Customer: FK;
ID_goods: FK;
Date;
Qty

实际上,第一个和第二个之间的区别在于发票。

所以我的问题很明确:

  1. 哪一个更好?
  2. 如果有第三个比我的解决方案更好,请建议我。
  3. 请告诉我一些帮助我提高正常化能力的方法。
  4. 最后抱歉我的英语不好;)

2 个答案:

答案 0 :(得分:1)

你绝对应该选择第一个......同时发票和发票_items。它更加规范化。您可能希望在将来添加的发票日期和其他发票数据(数字,状态,日期或其他此类内容)应位于其自己的表中。

如果您选择第二种解决方案,则会出现复杂的维护问题。如果要更改发票日期,则必须对所有invoices_items行执行此操作。而且你永远不会确定你在所有行上只有一个日期。如果数据可能出错......它会。为避免这种情况,请尝试将所有数据放在正确的逻辑表中。不要在多行上重复它,只是为了节省自己创建一个表。

答案 1 :(得分:0)

您的第一个解决方案更好。在您的第二个解决方案中,您有效地复制了发票中每个项目的日期和客户,这更容易出错(如果日期在具有相同ID的项目上有所不同怎么办?)和存储效率较低。