SQL 加入 table,最佳方式或替代设计
SQL Join to either table, Best way or alternative design
我正在为一个系统设计数据库,我想出了以下三个table
我的问题是 Address
可以属于 Person
或 Company
(或将来的其他东西)那么我该如何建模呢?
我放弃了将地址信息放在两个 table 中(人
和公司)因为它会被重复
我想在
Address
table 并保留其中之一为空,但随后我需要添加
每一个这样的未来关系都会出现一栏(对于
例如资产可以有一个地址,它位于)
我想到的最后一个选择是创建两列,一个
称为 Type
和其他 Id
,因此一对值将表示一个
目标 table 中的单个记录,例如:Type=Person,Id=5
和
Type=Company,Id=9
这样我就可以Join right table using the type
而且无论有多少 table 相关,它都只会是两列
这个table。但是我不能有降低数据完整性的约束
我不知道我是否设计得当。我认为这应该是一个常见问题(在联系信息等对象的这个小设计过程中,我至少遇到过三次...)但是我找不到很多与我的相似的信息或示例。
感谢您给我的任何指导
您可以采用几种基本方法,具体取决于您希望系统在未来得到证明的程度。
通常,Has-One 关系由拥有实体的外键建模,指向拥有实体的主键。所以你会在 Company
和 Person
上都有一个 AddressId
,这将是 Address.Id
的外键。您的情况的复杂性在于如何处理一个人可以有多个地址的事实。如果您 100% 确定只会有家庭地址和工作地址,则可以在 Person
上放置两个外键列,但如果有第三个、第四个、第五个等地址,这就会成为一个大问题。另一种选择是创建一个连接 table、PersonAddress
,其中包含三列 a PersonId
、AddressId
和 AddressType
,以指示它是否是家庭作业或任何地址。
我正在为一个系统设计数据库,我想出了以下三个table
我的问题是 Address
可以属于 Person
或 Company
(或将来的其他东西)那么我该如何建模呢?
我放弃了将地址信息放在两个 table 中(人 和公司)因为它会被重复
我想在
Address
table 并保留其中之一为空,但随后我需要添加 每一个这样的未来关系都会出现一栏(对于 例如资产可以有一个地址,它位于)我想到的最后一个选择是创建两列,一个 称为
Type
和其他Id
,因此一对值将表示一个 目标 table 中的单个记录,例如:Type=Person,Id=5
和Type=Company,Id=9
这样我就可以Join right table using the type 而且无论有多少 table 相关,它都只会是两列 这个table。但是我不能有降低数据完整性的约束
我不知道我是否设计得当。我认为这应该是一个常见问题(在联系信息等对象的这个小设计过程中,我至少遇到过三次...)但是我找不到很多与我的相似的信息或示例。
感谢您给我的任何指导
您可以采用几种基本方法,具体取决于您希望系统在未来得到证明的程度。
通常,Has-One 关系由拥有实体的外键建模,指向拥有实体的主键。所以你会在 Company
和 Person
上都有一个 AddressId
,这将是 Address.Id
的外键。您的情况的复杂性在于如何处理一个人可以有多个地址的事实。如果您 100% 确定只会有家庭地址和工作地址,则可以在 Person
上放置两个外键列,但如果有第三个、第四个、第五个等地址,这就会成为一个大问题。另一种选择是创建一个连接 table、PersonAddress
,其中包含三列 a PersonId
、AddressId
和 AddressType
,以指示它是否是家庭作业或任何地址。