设计重复数据

时间:2009-03-10 14:59:02

标签: database-design

我正在设计产品数据库,我有一个设计问题。

有几种不同类别的产品,比如书籍,视频游戏,家用电子产品和宠物用品。有一些共同点,比如制造商和价格,而其他一些东西对于每个类别都是独一无二的,比如功耗。

个别产品将定期更新,价格可能会波动,而制造商将保持相当稳定(我认为制造商可以被另一家公司购买并且品牌名称被吸收到采购公司)。更新可能每小时发生一次。每个产品的请求可以经常进行(取决于客户的数量,因此无限制)。

我更关心访问客户端数据的速度,而不是因为我对数据执行更新的速度。

哪个更有意义?为什么?:

  • 所有类别的一个表,其列允许为空(例如,宠物耗材的耗电量为空)
  • 每个类别的一个表,其中重复列(例如价格将在每个表中)
  • 一个用于共同特征的表(价格,制造商等),以及一个用于独特属性的表

2 个答案:

答案 0 :(得分:3)

退后一步,把头伸出数据库。你打算如何在你的应用程序中解决这个问题?通常,您将使用继承。超类将定义公共属性,而子类将定义特殊特征。

因此,您的问题可以重写为:如何在数据库中实现继承?

首先,尽量避免数据重复。如果您在交易中(或在您的代码中)犯了一个简单的错误,数据可能会变得不一致,没有人会知道哪个价格是正确的。

一个大表可能不是一个好的解决方案,因为你最终想要添加一个新功能。这会导致数据库中浪费的空间越来越多。另外,您要么必须为每个类构建查询,要么从数据库中检索大量的NULL。

这导致了一个多表的应用程序。公共基类映射到中央表,该表为实例提供ID。所有子类都使用较小的特殊表,这些表具有从基类填充的ID列。

加载数据时,将类的所有表连接在一起并一次加载所有数据(使用所有表中的ID)。这是非常有效的,因为数据查找遍历唯一的主键,简单的ID = ID连接不会花费太多。

答案 1 :(得分:2)

我会说一个表用于常用功能,另一个表用于具有独特属性。

您可以模拟装饰器模式之类的东西,其中额外的属性只是与产品相关联的标签。

您可能需要对标签进行分组,以便更轻松地添加新产品。

使用上述配置,您可能会发现使用新标记进行扩展更容易,并且在分类更改时添加/删除标记。


我可以看到其他方法存在以下问题。

如果所有内容都放在一个表中,您必须事先了解所有内容并不断更改表,因为新字段已被考虑并将许多字段保留为NULL。

根据每个类别的表格,您最终必须为每种类型的产品创建许多不同的查询并继续前进,这可能很难维护。