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

Enz*_*ero 8 sql-server database-design relational-database

目前我的用户表有以下字段

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

    Chr*_*ton 9

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

    1. 每个用户可能有多个地址吗?
    2. 地址是可选的还是强制性的?
    3. 城市,国家,地区的信息是否与地址中的信息重复?
    4. 用户可以拥有多个TelNos吗?
    5. TelNo是可选的还是强制性的?
    6. 用户可以拥有多个MobNos吗?
    7. MobNo是可选的还是强制的?
    8. 用户可以有多个电子邮件吗?
    9. 电子邮件是可选的还是必需的?
    10. NoOfMembers是根据用户数计算的吗?
    11. 可以有多个UserAttempts吗?
    12. 每个用户可以有多个BlockTime吗?

    如果对这些问题中的任何一个的回答是肯定的,则表明该区域中的3NF存在问题.3NF的原因是消除重复数据; 确保更新,插入和删除使数据保持一致; 并且最小化数据的存储 - 特别是不需要将数据存储为"尚未知道/未知/空".

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

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


    And*_*son 5

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