本文是《数据库设计那些事》的笔记杂想。
数据存储所要解决的问题就是,通过权衡增删改查的利弊,选择恰当的数据存储方式。
如何权衡呢?
比如考虑下面这张表,该表违背了第二范式的设计理念:
在增加行,即插入的时候,会出现什么问题?因为这个商品表是由商品信息和供应商信息耦合而成,如果供应商信息缺失或者部分缺失,那么在插入的时候就会存在问题(
找不到商品的供应商电话或者名称)。以后如果想补全供应商信息,得通过供应商名称找到相关行,然后再逐行更新电话。如果把供应商信息单独存储,商品表只保留一个供应商id,那么就会避免这种情况,即使供应商信息不全,也没关系,只要过会儿 供应商在
供应商表中补全了供应商信息即可,更新只要一行。
在删除的时候,会出现什么问题?如果供应商只有一件商品,那么删除那一行,供应商的号码就没了。
更新异常,就是插入异常的那个例子类似,更新得更新多行。
不过上面的那个表的设计,也是有好处的。好处就是查方便。
那么解决办法呢?
第一种解决办法:
将上面的表拆分成两张表,一张是商品表,一张是供应商信息表。在商品表中保留供应商 id。
这种解决方法,在删除、更新的时候,都没有问题,就是增加行的时候,得确保,提供供应商id,否则增的时候可能会出现问题。
此外,就是数据冗余。 就是 商品信息完全相同,只有 供应商id不同,结果要两行存储。
好处是相比较第二种办法,查询时更加方便,少查询一次。
第二种解决办法:
拆分出三张表。
这样商品信息和 供应商信息完全割裂开。
插入的时候是完全没有问题的。
增删改的问题也完全避免了。
缺点是查询时复杂。