我正在设计一个产品数据库,我有一个设计问题。
有几种不同的产品类别,例如书籍、视频游戏、家用电子产品和宠物用品。有一些共同点,例如制造商和价格,而另一些则是每个类别所独有的,例如功耗。
个别产品会定期更新,价格可能会波动,而制造商将保持相当稳定(我想制造商可能会被另一家公司收购,而品牌名称会被收购公司吸收)。更新可能每小时发生一次。可以频繁地请求每个产品(取决于客户数量,因此没有限制)。
与我执行数据更新的速度相比,我更关心客户端访问数据的速度。
哪个更有意义,为什么?:
- 所有类别的表格允许为空列(例如宠物用品的功耗为空)
- 每个类别一个表,重复列(例如价格将在每个表中)
- 一张表用于通用特征(价格、制造商等...),一张表用于独特属性
最佳答案
退后一步,把头从数据库中拉出来。你打算如何在你的应用程序中解决这个问题?通常,您将使用继承。父类(super class)将定义公共(public)属性,而子类将定义特殊特征。
所以您的问题可以改写为:如何在数据库中实现继承?
首先,尽量避免数据重复。如果您在交易(或代码)中犯了一个简单的错误,数据可能会变得不一致,而且没有人会知道哪个价格是正确的。
一张大表可能不是一个好的解决方案,因为您最终会想要添加一项新功能。这会导致数据库中越来越多的空间被浪费。另外,您要么必须为每个类构建查询,要么从数据库中检索大量 NULL。
这导致了多表方法。公共(public)基类映射到为实例提供 ID 的中央表。所有子类都使用更小的特殊表,这些表具有从基类填充的 ID 列。
加载数据时,将一个类的所有表连接在一起并一次性加载所有数据(使用所有表中的 ID)。这是非常有效的,因为数据查找是通过唯一的主键进行的,而简单的 ID=ID 连接不会花费太多。
关于database-design - 为重复数据设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/630649/