【问题标题】:Database design: user with contact information数据库设计:有联系信息的用户
【发布时间】:2011-09-01 04:19:15
【问题描述】:

我有一个数据库设计问题。

在我的应用程序中,用户的联系信息包括

  • 电话号码
  • 电子邮件
  • 地址线1
  • 邮箱
  • 地区(城市)

这当前位于“用户”表中,其中包含其他信息,如用户名、名字、...

问题是用户必须拥有相同类型的信息(电话、电子邮件等),但对于他的公司而言。

向“用户”表添加其他字段似乎是多余的。由于数据相似,我可以制作一个包含字段的“ContactInfo”表:

  • 电话
  • 电子邮件
  • 地址
  • 邮箱
  • ...

这是一个好主意吗?我应该如何处理“user”表和这个“contactInfo”表之间的关系?

编辑:我忘了说公司联系信息不是强制性的。用户可以根本没有公司。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    您应该有一个单独的电话表、一个单独的电子邮件表和一个单独的地址表。人们拥有以上三种中的一种。

    【讨论】:

      【解决方案2】:

      单独的表是正确的选择。

      CREATE TABLE users (
        id INT UNSIGNED NOT NULL,
        foo VARCHAR(50),
        PRIMARY KEY (id) );
      
      CREATE TABLE user_contact_info (
        id INT UNSIGNED NOT NULL,
        user_id INT UNSIGNED NOT NULL,
        contact_type VARCHAR(40) NOT NULL,
        phone VARCHAR(20),
        email VARCHAR(200),
        address VARCHAR(200),
        postal_box VARCHAR(20),
        PRIMARY KEY (id, user_id) );
      

      如果您的数据库支持外键,则应该有一个从 user_contact_info.user_idusers.id 的外键。 user_contact_info.contact_type 将设置为 workhome 或您需要的任何其他类别。

      【讨论】:

      • 这其实是我想做的。这似乎是正确的选择
      • 唯一的事情是可选的工作信息。我想知道当用户删除他的公司信息时该怎么办。 user_contact_info 中的行将是空的。
      • 您是说您要跟踪公司的联系信息吗?如果是这样,只需添加一个companies 表。如果一家公司可以有多个电话、地址等,请制作一个company_contact_info 表,如上面的user_contact_info 表。如果要将user 关联到company,请创建一个支持多对多关系的user_company 表(带有关系类型的指示符:employeecustomer,两者都有? )。
      • @Marc,如果用户删除了他们的公司信息,请删除user_contact_info中的对应行。它不会是空白的,它会消失的。
      • 在我的例子中,一个用户只能拥有一家公司。我必须为每个公司保留一个号码、电子邮件等。我只是说公司信息不是强制性的,用户可以删除这些信息。我不想跟踪它,但如果我只是在数据库中更新它,所有字段都将为空。
      【解决方案3】:

      任何与用户之间具有 1:M 关系的东西都应该放在自己的桌子上。如果您只关心用户的主要联系信息,那么您可以将其保留在 User 表中。

      例如:如果有两个(或更多)电话号码是可以接受的,那么您将有另一个表,其中包含用户表的外键以及电话号码、电话类型和联系顺序优先级。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 2012-07-15
        • 1970-01-01
        • 2010-09-10
        • 2011-01-08
        相关资源
        最近更新 更多