代码之家  ›  专栏  ›  技术社区  ›  Sejanus

联系人详细信息的SQL数据库模型

  •  1
  • Sejanus  · 技术社区  · 15 年前

    我需要一个数据库来存储,即用户记录。日常用品:姓名、电子邮件、地址、电话、传真等。问题是,在这种情况下,每个用户可以有多个电话号码。以及多封电子邮件。甚至不止一个地址。不止一件事。

    一种方法是将所有内容存储在一个表中,例如将序列化电话数组存储在一个电话列中。或在一个电话列中使用逗号分隔的电话。但我真的不喜欢这种方式,我宁愿做过复杂的数据库,使编程逻辑比另一种方式更简单。

    另一个是单独的电话表,单独的地址表等等。柱: 身份证件 ,请 顾客身份证 ,请 电话 . 顾客身份证 参考文献 客户 . 身份证件 现在,这似乎是一个真正的过度杀伤力,有大约10个表只用于存储联系人的详细信息。

    我想到的另一个想法是为联系人添加一个表 身份证件 , 顾客身份证 (<-外键) 钥匙 , 价值 . 其中键可以是“phone”和值“+123 3435454”,或者键“e-mail”和值…你明白了。到目前为止,我最喜欢这个。

    你有什么建议?3方法的缺点是什么?

    我要用的数据库是 波斯特雷斯尔 但这并不重要。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Dave7896    15 年前

    一些纯粹主义者会建议第三条路应该走。事实上,使用这种方法,理论上可以构建一个单表数据库!

    然而,正如gbn所提到的,这将导致特定格式的问题,并且您只需要在客户机上强制执行数据长度等。

    我同意你的第二个建议,使用不同表格的方法,地址类型、电话号码类型等与下面所示类似。

    身份证号码 addrss_类型varchar(主页/联系人/邮件等) 加法器\u line1 varchar 加法器-2 varchar 等

        2
  •  3
  •   gbn    15 年前

    每个实体一个表行是正确的。所以一个用于电子邮件,一个用于电话号码等是正确的。这不是过度杀戮:这是规范化的数据库设计。

    您的选项3可以完成,但是,比方说,如果您想对电话号码和电子邮件地址强制执行某种模式,该怎么办?

        3
  •  3
  •   user80168    15 年前

    有些人可能会说方法3是最好的。其他人会说,它基本上是数据库中最常见的反模式之一,即 EAV 这让人非常讨厌。

    至于我,我对你的申请知之甚少,无法提出解决方案。通常-方法2为您提供了最多的功能。

    还有方法4,它是变体-方法5:

    4-使用值数组-即,电话列不是文本数据库,而是文本[],然后您可以在其中存储许多电话。

    5-既然你在PostgreSQL上-使用它。contrib中有相当酷的hstore数据类型,您可以使用它来代替数组来添加一些语义(比如电话类型)。

        4
  •  2
  •   Rubens Farias    15 年前

    缺点:

    1. 这违反了第一个正常形式,因为一个字段有许多值
    2. 如你所说,这将是一场噩梦
    3. 似乎是下注选项,但可以通过使用域表对该“key”值进行规范化。

      • Customer (Id, Name)
      • AdditionalData( Id, Name ) (电话、地址等)
      • CustomerAdditionalData(Id, CustomerId, AdditionalDataId, Value)