【发布时间】:2016-09-26 05:48:36
【问题描述】:
在设计我的数据库时,我将地址创建为一个模块化系统。一个表有AddressID,其余的地址表有一行AddressID 及其信息类型(即电话号码、电子邮件地址、物理地址等)。这是为了节省空间并为可能没有每列信息的地址和未来可能包含比我预期更多的信息的地址添加可扩展性。
数据库中的其他实体有一个AddressID 列(如InsuranceCompany 和BranchOffice 等表)。当我在其中一个实体中插入新行时,我需要提供AddressID。我想知道,设计这个的最佳方法是什么?我可以将所有各种信息类型(电话号码、物理地址等)作为列的视图,然后先插入视图,然后输出AddressID 以插入@ 987654329@实体?我应该使用存储过程吗?
Table 1 - Address
AddressID int identity
Table 2 - PhoneNumber
AddressID int
PhoneNumber varchar(10)
Table 3 - PhoneNumberForeignPart
AddressID int
CountryCode varchar(5)
PhoneNumberSuffix varchar(5)
Table 4 - PhoneNumberExtenstion
AddressID int
PhoneNumberExtension varchar(5)
Table 5 - EmailAddress
AddressID int
EmailAddress varchar(50)
...
Table 10 - InsuranceCompany
InsuranceCompanyID int identity
InsuranceCompanyName varchar(40)
AddressID int
Disabled bit
谢谢。
【问题讨论】:
-
老实说,我不认为维护这个结构会让人头疼。如果你想要一个地址表,把所有的列都放进去与物理地址(街道、城市、州、国家、电话等)相关。然后,像在
InsuranceCompany中一样使用外键。当null具有某些含义时,可以使用null字段(例如,将 Street1、Street2 和 Street3 放在一个表中很好;Street2 和 Street3 几乎总是为空——您不会将它们放在不同的表中)桌子,你会吗?)。 -
进一步了解 Cory 的观点。应使用第三范式(tutorialspoint.com/sql/third-normal-form.htm)设计数据库。维护起来会容易很多。添加新列不会有问题,因为您可以在添加列时设置默认值或允许
NULL。 -
我 10000% 同意 @Cᴏʀʏ。不过,我会添加一些内容。您的电话号码有 10 个字符,但您指出您需要能够支持国际数据。那空间不够。您的电子邮件地址也为 50。对于某些电子邮件地址,您需要将其设置得更大。真正的最大长度绝对是荒谬的,但您可能需要至少 100 个字符。如果你坚持这种疯狂的设计,你可能还想在几乎每个带有外键的表上包含一个唯一索引。你不能允许一个地址有多个 CountryCodes。
标签: sql sql-server database-design