背景:我有一个包含父母和孩子名字的数据库(这是对实际数据的简化,但类比很接近足够)。
任务:数据库必须为每个父存储儿童姓名的有序列表。
假设:
children_names_list_id
而不是保留实际名称的副本。问题:
当前(建议)解决方案:
我目前的方法是建立一个表格,将子名称映射到整数名称ID (名称很长,整数很短)。
然后在以下元组中存储名称列表:<list_id> <order> <name_id>
,因此列表将如下所示:
<list_id> <order> <name_id>
1 1 123
1 2 345
1 3 678
2 1 901
3 1 123
3 1 901
示例表包含三个列表:[123,345,678],[901],[123,901],可能对应于:[“Alice”,“Bob”,“Carol”],[“Dave”],[“爱丽丝“,”戴夫“]
然后,父表将有一个引用children_list_id
列的list_id
列。
除了两个问题外,这个解决方案似乎很强大:
list_id
和order
列组成; parent表必须仅引用应该是外键的list_id
,但由于list_id
在列表中本身不是一个键,所以另外还有一个列表表,其中{{1}是关键是需要的。这看起来很麻烦。 替代解决方案:
列表将在列中存储隐式排序:
list_id
在此表中,<list_id> <name_1> <name_2> <name_3> <name_4> ... <name_100>
1 111 222 333 null
2 444 null
3 555 111 null
将成为主键。
parent表将list_id
保留为外键。
这个解决方案不太健壮(我创建了多少列?10?20?50?),但插入速度更快。由于list_id
是关键,因此不需要额外的表。然而,可能的缺点是某些查询变得更加复杂,因为它们必须引用多个列。
谢谢!
答案 0 :(得分:1)
list
表格过度设计。只需要一个Parents
表,一个Names
表和一个ParentChildren
表。除了一些细节之外,ParentChildren
表就像列表一样。它看起来像是:
<ParentId> <Order> <NameId>
1 1 123
1 2 345
1 3 678
2 1 901
3 1 123
3 1 901
我没有看到存储独立列表的特别节省。只需为每位父母存储孩子。