Database design 在数据库中有重复记录总是错误的吗?

Database design 在数据库中有重复记录总是错误的吗?,database-design,duplicate-data,Database Design,Duplicate Data,上下文:用户在某个城市、某一天、某一时间,为某个主题、某个级别创造挑战 用户可能会在同一城市、同一天、同一时间遇到更多相同主题、级别的挑战(挑战同时进行) 挑战可以一次创建一个 在我的实际表中,这种情况下我有重复的记录(主键值不同)。这是错的吗?应该怎样 表2挑战: id_challenge INT (pk auto increment) id_subject INT id_level INT id_city INT id_user INT date DATE time TIME commen

上下文:用户在某个城市、某一天、某一时间,为某个主题、某个级别创造挑战

用户可能会在同一城市、同一天、同一时间遇到更多相同主题、级别的挑战(挑战同时进行)

挑战可以一次创建一个

在我的实际表中,这种情况下我有重复的记录(主键值不同)。这是错的吗?应该怎样

表2挑战:

id_challenge  INT (pk auto increment)
id_subject INT
id_level INT
id_city INT
id_user INT
date DATE
time TIME
comment VARCHAR(100)

从技术上讲,我不认为这些记录本身是“重复的”,因为它们指的是两个不同的实体——即使注释是相同的。我当然指的是挑战79和挑战80被分开处理的情况,即使它们有相同的数据。也就是说,在用户参与的挑战列表中,他们可以将两个挑战列为两行。同样的比喻也延伸到一个城市的挑战清单上

但是,如果您发现自己对这些行进行分组、计数或排序以删除重复项,这就是一种气味。即使UI只允许您一次创建一个,每个新的组合也更像是一个可以多次调用的“概要文件”。存储数量或拥有父“挑战配置文件”表可能是更好的选择

此外,如果每个给定组合的“重复”行数为数百万,则在强制发布、声明重复和规范化时,您可能会看到一些大小优势。但即使这样,存储也很便宜,而且对于一个表来说,一百万条记录只有几MB



但是…事实上,用户以这种方式一行一行地创建多个行,这可能表明需要重新设计某些东西-可能在前端和后端都需要重新设计。

实际上,您尝试建模的实体是可单独识别的东西,您的数据库记录中关于它们的事实是不同的事实。如果一个表复制了这些事实,那么它就不是真实和精确的现实表示。如果主键值不同,从技术上讲,行就不会“复制”。当然,真正的问题是,您是否应该将多个这样的行“折叠”为一行,这取决于您的业务规则(即,两个选项都不是“绝对”错误-这取决于您试图实现的目标)。