【问题标题】:How to design a database in which there are many users and each has a list of multiple contacts?如何设计一个有很多用户并且每个用户都有多个联系人列表的数据库?
【发布时间】:2013-07-18 22:08:54
【问题描述】:

到目前为止,我所配置的只是一个用户表,其中每个用户都有一个唯一的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;,因为每次都需要迭代每个条目。

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

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案1】:

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

    您担心它的性能,因为担心“缺乏索引”。

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

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

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

    【讨论】:

    • 同意永远不要有可变数量的桌子!
    • 仅用于学习目的,主键将是用户和联系人的唯一组合?就是这么简单!我不知道主键可以跨越多个列。我是新手。谢谢!
    • @CannonPalms:你去吧。 :) 作为记录,成为新人并不是真正的“借口”,因为the relevant manual page 的第一行就提到了这一点。
    • 不知道这是我问题的解决方案,我没有专门搜索有关主键的信息。您在使用新技术(对您来说是新的,对世界来说并不新)时做的第一件事是从头到尾阅读手册吗?
    • @CannonPalms:是的,当然是!这就是手册存在的原因...为什么,您的第一步是什么? ://
    【解决方案2】:

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

    【讨论】:

    • 那么另外,在contacts 表中保存特定用户的联系人start_index 的表,当添加或删除联系人时,索引将被更新?
    • @CannonPalms:呃,不。自 1960 年代以来,数据库已经为您完成了这项工作。在您的 MySQL 手册中查找“索引”。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多