用户和地址应该在单独的表中吗?

时间:2011-07-04 22:08:35

标签: sql-server database-design relational-database

目前,我的用户表格包含以下字段

  • 用户名
  • 密码
  • 名称
  • 地址
  • 国家
  • 区域
  • TelNo
  • MobNo
  • 电子邮件
  • MembershipExpiry
  • NoOfMembers
  • DOB
  • 性别
  • 阻止
  • UserAttempts
  • BlockTime
  • 禁用
  • 我不确定是否应该将地址字段放在另一个表中。我听说如果不这样做,我会打破3NF虽然我不明白为什么。有人可以解释一下吗?

    5 个答案:

    答案 0 :(得分:9)

    有几点肯定不是3NF;还有一些有问题的:

    1. 每个用户可能有多个地址吗?
    2. 地址是可选的还是强制性的?
    3. 城市,国家/地区的信息是否与地址中的信息重复?
    4. 用户可以拥有多个TelNos吗?
    5. TelNo是可选的还是强制性的?
    6. 用户可以拥有多个MobNos吗?
    7. MobNo是可选的还是强制性的?
    8. 用户可以拥有多封电子邮件吗?
    9. 电子邮件是可选的还是必需的?
    10. NoOfMembers是根据用户数计算的吗?
    11. 可以有多个UserAttempts吗?
    12. 每个用户可以有多个BlockTime吗?
    13. 如果对这些问题的回答是肯定的,则表明该区域的3NF存在问题。 3NF的原因是消除重复数据;确保更新,插入和删除使数据保持一致;并最大限度地减少数据存储 - 特别是不需要将数据存储为“尚未知道/未知/无效”。

      除了这里提出的问题之外,还有一个问题是你的桌子的主键是什么 - 我猜这与用户有关,但你提供的名字和其他信息不太可能是唯一的,所以不足以作为PK。 (如果你认为姓名加姓氏是唯一的,你建议你永远不会有一个以上的约翰史密斯?)

      编辑: 根据一些字段是可选的进一步信息,我建议您将可选字段分成不同的表,并在新表和用户表之间建立1-1链接。将通过在引用用户表的主键的新表中创建外键来建立此链接。正如你所说,没有一个字段可以有多个值,那么它们目前不太可能给你带来问题。但是,如果这些中的任何一个发生了变化,那么不将它们拆分会给您带来升级应用程序和数据以支持应用程序的问题。您仍然需要解决主要问题。

    答案 1 :(得分:5)

    只要每个用户都有一个地址且每个地址属于一个用户,他们就应该进入同一个表(一对一的关系)。但是,如果不要求用户输入地址(可选关系),则适合使用单独的表。此外,在奇怪的情况下,许多用户共享相同的地址(例如,他们在同一个监狱中被定罪),你有一对多的关系,在这种情况下,一个单独的表将是要走的路。编辑:是的,正如有人在评论中指出的那样,如果用户有多个地址(反之为1对多),那么还应该有单独的表格。

    答案 2 :(得分:1)

    重点是,如果你想在将来为同一个用户提供两个地址,你应该立即拆分并拥有一个地址表,其中FK指向用户表。

    P.S。你的表缺少一个用作PK的标识,比如Id或UserId或DataId,按你想要的方式调用它......

    答案 3 :(得分:1)

    就像我认为在这个问题中可能会帮助某人一样,我曾经遇到过这样一种情况:我把地址放在用户/网站/公司/等表中,因为我想,为什么我需要多个地址呢?他们?然后在我们完成所有事情之后,我们需要一个不同的部门引起我的注意,我们需要记录发货地址和账单地址。

    故事的寓意是,这是一个经常要求,所以如果您认为想要记录发货地址,或者可以想到任何您可能想要为用户记录的其他类型的地址,请将其放在单独的表中。

    在今天的时代,我认为电话号码也可以存放在单独的表格中。每个人都有手机号码,家庭电话号码,工作号码,传真号码等等,即使你只打算要求一个人,人们仍然会把两个人放在场上,用分号分开(相信我)。在您的数据库设计中需要考虑的其他事项。

    答案 4 :(得分:0)

    通过将它们添加到单独的表中,如果您稍后决定,则可以更轻松地扩展应用程序。我通常有一个简单的用户表,其中包含user_id或id,user_name,first_name,last_name,password,created_at&的updated_at。然后我有一个包含其他信息的个人资料表。

    尽管如此,它确实是所有的偏好。