【问题标题】:Design SQL Insert When Using Modular Address使用模块化地址时设计 SQL 插入
【发布时间】:2016-09-26 05:48:36
【问题描述】:

在设计我的数据库时,我将地址创建为一个模块化系统。一个表有AddressID,其余的地址表有一行AddressID 及其信息类型(即电话号码、电子邮件地址、物理地址等)。这是为了节省空间并为可能没有每列信息的地址和未来可能包含比我预期更多的信息的地址添加可扩展性。

数据库中的其他实体有一个AddressID 列(如InsuranceCompanyBranchOffice 等表)。当我在其中一个实体中插入新行时,我需要提供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


【解决方案1】:

好吧,你们这些混蛋,告诉我我的想法很愚蠢。

很明显,你是对的。谢谢@Cory、@Eric S 和@Sean Lange。

我将不同的表合并到一个“地址”表中。在放弃之前,我尝试了存储过程、用户函数和视图的组合,但很明显我只是想将一个方形钉子装入一个圆孔中。

按照您@Sean Lange 的建议,我扩大了电子邮件字段的长度。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2014-01-12
    • 2013-04-25
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多