如何设计一个数据库,其中有很多用户,每个用户都有一个多个联系人的列表?

时间:2013-07-18 22:08:55

标签: mysql sql database database-design

到目前为止,我配置的只是一个用户表,每个用户都有一个唯一的user_id。但是,我需要为每个用户存储联系人列表。这只需要包含每个联系人的user_id。但是,我面临着设计挑战。

我应该为每个用户创建一个表来存储该用户的联系人列表吗?这是一个可扩展的解决方案吗?

或者我应该创建一个包含两列user_idcontact_id的表,看起来像这样:

------------------------------------
| user_id (INT) | contact_id (INT) |
------------------------------------
|    10001      |       9945       |
|    10001      |       2239       |
|    10002      |       9636       |
------------------------------------

我担心如果我使用第二个选项,缺少唯一索引和表的绝对大小最终会使SELECT * FROM contacts WHERE user_id=10001;因为每个条目都需要在每次重复。< / p>

组织这些数据的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

单个规范化表格绝对是正确的方法。

由于担心“缺乏索引”,你担心它的表现。

缺乏索引?为什么缺乏索引?

制作你的主键(user_id,contact_id) - 这在语义上是一个'全部 - 而且这就是你所需要的。

从不,拥有可变数量的表格。 “每个用户的表格”是指从我的团队启动的时候。 ;)

答案 1 :(得分:1)

使用“pivot”表的第二种方法是规范化的最佳方法和最佳实践。您还希望将索引的外键关系设置为正确的表和列。

答案 2 :(得分:0)

  我担心,如果我选择第二种选择,缺乏独特性   索引和表格的绝对大小最终会变得均匀   SELECT * FROM contacts WHERE user_id = 10001;因为每个条目都会   需要每次迭代。

user_id上的索引将消除此问题。它将使用在大量记录上表现良好的搜索算法,而不是迭代。如果where user_id=是最常见的查询类型,则聚簇索引将使性能更好。

第一个选项,每个用户一个表,绝对是你做过的最糟糕的方式。