【问题标题】:Separate tables for name and email addresses?名称和电子邮件地址的单独表格?
【发布时间】:2012-04-27 23:32:59
【问题描述】:

自从我开始处理我的数据库以来,我一直在与最初的决定作斗争。我正在争论是否需要单独的电子邮件地址表。我的数据库如下所示:

people(id, first_name, last_name, email)
addresses(id, address, street, city, state, zip, latitude, longitude)
addresses_people(id, person_id, address_id)
phone_numbers(id, person_id, phone_number, type)

我认为我不需要单独的电子邮件地址表,因为我只希望每人一个,无论他们是否有更多。我似乎遇到的问题是有些人没有电子邮件地址。很多时候,我会将孩子存放在 people 表中。现在,如果我将电子邮件地址放在单独的表中以避免我将拥有数千个空电子邮件字段,似乎会是更好的设计。

现在要更改它是一件非常麻烦的事情,因为该应用已经在一定程度上已经投入生产了,但是现在更改它而不是一两年后会成倍地容易。将电子邮件更改为另一张桌子是否值得一两天?

【问题讨论】:

  • 那么您将用数千个空文本字段替换数千个空外键字段。
  • 什么比例的字段会是空的?
  • @Mr.Disappointment:外键可能在emails 表一侧。
  • @StuartDunkeld 我会说大约 30%。
  • 是的,外键将在电子邮件方面。 id、person_id、email 所以没有空字段

标签: database database-design relational-database


【解决方案1】:

在我看来,你过度设计了。可选的email 字段很好。实际上有一个单独的表可能会带来更大的开销。

如果您希望用户拥有多个电子邮件,则使用单独表的唯一原因是为 1-N 关系建模。

【讨论】:

  • 感谢您的快速回答!我喜欢这个答案:) 节省了我很多时间。只是一个小的后续问题。我的addresses_people 表呢?我最近意识到,不止一个人可以拥有相同的地址。例如,我想将孩子的母亲和父亲存储为两个不同的人,但他们的地址相同。使用链接表addresses_people 比为两个不同的人使用相同的地址更好吗?不过这种情况不会经常发生。大多数情况下,我会存储一个父级,但我希望两者都可以选择。
  • @Brian:实际上,如果一个人只能住在一个地方,我只会在people 表中使用address_id 外键 - 不需要addresses_people 加入表。此外,地址通常只是人员记录的一部分——但它是一种非规范化的形式。
  • 这似乎很明显:) 我不知道为什么我会这么想!
  • 很有趣,那么您如何让用户更新电子邮件?使用单个表,用户更改电子邮件,您向旧电子邮件和新电子邮件发送确认,但只有在用户确认后才会使用新电子邮件
【解决方案2】:

我相信没有必要改变它。大多数时候,让一些字段连续为空并不是什么大问题。事实上,它在大多数数据库中都很常见。数据库的设计应主要取决于您尝试建模的对象,而不是仅仅出于存储原因将事物分成表,除非您有严重的存储限制或其他情有可原的情况。

请参阅Database design - empty fields,这也为您的问题提供了很多启示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多