【发布时间】:2021-12-01 10:10:14
【问题描述】:
假设我有一个用户表,其中包含一个 id 列和一个排名列。 每个用户都可以按某种顺序对其他用户进行排名。 假设这个列表可能很长(某个常数的最大值,比如 10,000),但通常会短得多。 只需要存储和检索用户的整个列表,也就是说,每个列表都不需要是例如在查询中搜索。
一个想法是以逗号分隔的字符串形式将其存储为 id 列表。 唯一的缺点是外键不能将列表中的每个 id 连接到相应用户的 id 列,这意味着如果用户的 id 发生更改,它不会在列表中自动更改。但是,用户的 id 永远不会改变,所以这是一个原则问题(不破坏 1NF?)。
另一个想法是创建一个表,其中每个条目都有一个 from 和 to 用户 ID 列以及一个排名列。这样做的缺点是,与用户数量相比,该表可能包含大量记录(例如数十亿)。此外,在检索用户列表时,它需要搜索许多记录。有重复的数据,例如排名现在是显式存储的,而不是隐式存储的,这意味着在列表中进行一次更改可能意味着属于该列表的所有记录都必须更新其排名列。
什么是更好的解决方案?有完全不同的解决方案吗?
编辑: 我想大多数人会说第二个是最好的,因为它是一个关系数据库,但是,你能说可以减轻负面影响或者为什么它们不重要吗?如果有序列表可以更长,例如每个都有数百万个元素,所以列表更像是一团数据,而一个等效的表可能包含数万亿个条目?
当使用表格时,用户可能需要将排名复制到前端语言的数组中以进行编辑,因此每次更改都必须在前端和后端进行,或者必须删除旧记录并为新列表的每个元素插入一条新记录。
【问题讨论】:
标签: sql database-design