2

到目前为止,我所配置的只是一个用户表,其中每个用户都有一个唯一的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;由于每次都需要迭代每个条目,因此缺少唯一索引和表的绝对大小最终会造成平衡。

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

4

3 回答 3

3

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

由于担心“缺乏索引”,您担心它的性能。

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

让你的主键(user_id,contact_id)——这在语义上是有意义的——这就是你所需要的。

永远不会有可变数量的表格。“每个用户一张桌子”是当您从我的团队中启动时。;)

于 2013-07-18T22:15:20.127 回答
1

“数据透视”表的第二种方式是规范化的最佳方式和最佳实践。您还希望与正确表和列的索引建立外键关系。

于 2013-07-18T22:12:20.813 回答
0

恐怕如果我选择第二个选项,缺少唯一索引和表的绝对大小最终会导致 SELECT * FROM contacts WHERE user_id=10001; 因为每次都需要迭代每个条目。

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

第一个选项,每个用户一张桌子,绝对是你能做到的最糟糕的方式。

于 2013-07-18T22:15:12.617 回答