sql-server – 用户和地址应该在单独的表中吗?

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

>用户名
>密码
>姓名
>姓氏
>城市
>地址
>国家
>地区
> TelNo
> MobNo
>电子邮件
> MembershipExpiry
> NoOfMembers
> dob
>性别
>被阻止
> UserAttempts
> BlockTime
>已禁用

我不确定是否应该将地址字段放在另一个表中.我听说如果不这样做,我会打破3NF虽然我不明白为什么.有人可以解释一下吗?

解决方法

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

>每个用户可能有多个地址吗?
>地址是可选的还是强制性的?
> City,Country,Region中的信息是否与地址中的信息重复?
>用户可以拥有多个TelNos吗?
> TelNo是可选的还是强制性的?
>用户可以拥有多个MobNos吗?
> MobNo是可选的还是强制的?
>用户可以有多个电子邮件吗?
>电子邮件是可选的还是强制性的?
> NoOfMembers是根据用户数计算的吗?
>可以有多个UserAttempts吗?
>每个用户可以有多个BlockTime吗?

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

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

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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...