carlosm Asked: 2024-08-23 02:09:26 +0800 CST2024-08-23 02:09:26 +0800 CST 2024-08-23 02:09:26 +0800 CST 地址和员工之间存在多对多关系,其中主要关系为 772 我有这种情况,一个员工可以有多个地址,因此我们创建一个关系表 EmployeeAddress,现在在团队中他们建议在 Employee 表中添加一个 AddressId,它将是主要地址,然后在 EmployeeAddress 中包含其余地址,当然,您指定为主要地址的地址应该是 EmployeeAddress 表中的地址之一,这是一种好方法还是最好总是去 EmployeeAddress 并在那里放一个 IsPrimary 列来找到主要地址? sql-server 2 个回答 Voted Jonathan Fite 2024-08-23T04:04:08+08:002024-08-23T04:04:08+08:00 我倾向于在 EmployeeAddress 表中添加一个标志,表明它是主要地址。 但是,也有一些注意事项。应用程序或触发器必须强制一次只能有一个地址作为主地址。这可以通过查看员工的所有地址并确保只检查一个地址来实现,或者主地址确实在员工表中,然后将其放在那里。 ... 这句话很长,我可以从两个方面来看待论点。我认为,正常形式会说将 IsPrimary 标志放在 EmployeeAddress 表上,因为那是最合适的位置。 Best Answer Rodger Kong 2024-08-23T11:38:30+08:002024-08-23T11:38:30+08:00 很难说哪种方式更好,但你可以考虑使用场景、编程难度、可维护性、数据大小、数据库负载等。这是我做的比较。 设想 在员工中添加 AddressId 在 EmployeeAddress 中添加 IsPrimary 在员工信息页面显示主要地址 如果不需要显示AddressType.Name,只需要JOIN EmployeeAddress和Address,否则JOIN所有4个表 JOIN全部 4 张桌子 显示员工的所有地址,并指明当前的主要地址。(例如,提供可选地址来更改员工的主要地址时) JOIN全部 4 张桌子 JOIN EmployeeAddress,,AddressAddressType 添加新地址作为员工的主要地址(假设地址类型已经预设且稳定) 在事务中提交插入Employee到EmployeeAddressAddress 在事务中EmployeeAddress提交插入Address 添加非员工主要地址的新地址 插入到EmployeeAddress,Address 插入到EmployeeAddress,Address 切换员工的主要地址 更新 1 行Employee 更新第 2 行EmployeeAddress 如果需要主要地址 使用NOT NULL约束 必须编程(在数据库或客户端) 保持每个员工主要地址的唯一性 这是 必须编程(在数据库或客户端) 要使用的表空间 几乎每一行都AddressId有价值Employee 很多NULLIsPrimayEmployeeAddress 其他的 通常,Employee包含许多列来存储员工的信息,这意味着可能有不同的用例Employee同时更新,并发锁有更多的机会。表越大意味着交易时间越长,这可能会对这个案例(主地址)和其他用例产生更多负面影响。 Address和的用例EmployeeAddress非常简单,对同一个员工地址进行并发操作的机会要小得多,并且表要小得多,事务提交更快。 我的想法是,如果的Employee设计容量不是很大,那么使用会更方便AddressID,Employee否则使用IsPrimary会EmployeeAddress更具可扩展性。 希望这对您的讨论有用。
我倾向于在 EmployeeAddress 表中添加一个标志,表明它是主要地址。
但是,也有一些注意事项。应用程序或触发器必须强制一次只能有一个地址作为主地址。这可以通过查看员工的所有地址并确保只检查一个地址来实现,或者主地址确实在员工表中,然后将其放在那里。
... 这句话很长,我可以从两个方面来看待论点。我认为,正常形式会说将 IsPrimary 标志放在 EmployeeAddress 表上,因为那是最合适的位置。
很难说哪种方式更好,但你可以考虑使用场景、编程难度、可维护性、数据大小、数据库负载等。这是我做的比较。
AddressType.Name
,只需要JOIN
EmployeeAddress
和Address
,否则JOIN
所有4个表JOIN
全部 4 张桌子JOIN
全部 4 张桌子JOIN
EmployeeAddress
,,Address
AddressType
Employee
到EmployeeAddress
Address
EmployeeAddress
提交插入Address
EmployeeAddress
,Address
EmployeeAddress
,Address
Employee
EmployeeAddress
NOT NULL
约束AddressId
有价值Employee
NULL
IsPrimay
EmployeeAddress
Employee
包含许多列来存储员工的信息,这意味着可能有不同的用例Employee
同时更新,并发锁有更多的机会。表越大意味着交易时间越长,这可能会对这个案例(主地址)和其他用例产生更多负面影响。Address
和的用例EmployeeAddress
非常简单,对同一个员工地址进行并发操作的机会要小得多,并且表要小得多,事务提交更快。我的想法是,如果的
Employee
设计容量不是很大,那么使用会更方便AddressID
,Employee
否则使用IsPrimary
会EmployeeAddress
更具可扩展性。希望这对您的讨论有用。