database-design - 为重复数据设计

标签 database-design

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

有几种不同的产品类别,例如书籍、视频游戏、家用电子产品和宠物用品。有一些共同点,例如制造商和价格,而另一些则是每个类别所独有的,例如功耗。

个别产品会定期更新,价格可能会波动,而制造商将保持相当稳定(我想制造商可能会被另一家公司收购,而品牌名称会被收购公司吸收)。更新可能每小时发生一次。可以频繁地请求每个产品(取决于客户数量,因此没有限制)。

与我执行数据更新的速度相比,我更关心客户端访问数据的速度。

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

  • 所有类别的表格允许为空列(例如宠物用品的功耗为空)
  • 每个类别一个表,重复列(例如价格将在每个表中)
  • 一张表用于通用特征(价格、制造商等...),一张表用于独特属性

最佳答案

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

所以您的问题可以改写为:如何在数据库中实现继承?

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

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

这导致了多表方法。公共(public)基类映射到为实例提供 ID 的中央表。所有子类都使用更小的特殊表,这些表具有从基类填充的 ID 列。

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

关于database-design - 为重复数据设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/630649/

相关文章:

php - 存储相似音乐的最佳方式

python - 如何在 appengine 中模拟追随者流?

mysql - 数据库设计 : to EAV or not to EAV?

mysql - 是我表设计错误还是建表时选择的索引错误?

mysql - SQL TableView JOIN 返回最小值

postgresql - 我的表是否需要一个主键,它有一个 UNIQUE(复合 4 列),其中一个可以为 NULL?

mysql - 两次更新或删除和插入哪个更成本?

sql - 表示数据库中的时间表

sql - 数据库设计 - 链接两个用户

mysql - 如何从 Mysql 中的不相关表强制执行外键约束?