到目前为止,我配置的只是一个用户表,每个用户都有一个唯一的user_id
。但是,我需要为每个用户存储联系人列表。这只需要包含每个联系人的user_id。但是,我面临着设计挑战。
我应该为每个用户创建一个表来存储该用户的联系人列表吗?这是一个可扩展的解决方案吗?
或者我应该创建一个包含两列user_id
和contact_id
的表,看起来像这样:
------------------------------------ | user_id (INT) | contact_id (INT) | ------------------------------------ | 10001 | 9945 | | 10001 | 2239 | | 10002 | 9636 | ------------------------------------
我担心如果我使用第二个选项,缺少唯一索引和表的绝对大小最终会使SELECT * FROM contacts WHERE user_id=10001;
因为每个条目都需要在每次重复。< / p>
组织这些数据的最佳方法是什么?
答案 0 :(得分:3)
单个规范化表格绝对是正确的方法。
由于担心“缺乏索引”,你担心它的表现。
缺乏索引?为什么缺乏索引?
制作你的主键(user_id,contact_id)
- 这在语义上是一个'全部 - 而且这就是你所需要的。
从不,曾拥有可变数量的表格。 “每个用户的表格”是指从我的团队启动的时候。 ;)
答案 1 :(得分:1)
使用“pivot”表的第二种方法是规范化的最佳方法和最佳实践。您还希望将索引的外键关系设置为正确的表和列。
答案 2 :(得分:0)
我担心,如果我选择第二种选择,缺乏独特性 索引和表格的绝对大小最终会变得均匀 SELECT * FROM contacts WHERE user_id = 10001;因为每个条目都会 需要每次迭代。
user_id上的索引将消除此问题。它将使用在大量记录上表现良好的搜索算法,而不是迭代。如果where user_id=
是最常见的查询类型,则聚簇索引将使性能更好。
第一个选项,每个用户一个表,绝对是你做过的最糟糕的方式。