数据库设计和地址垂直与水平

时间:2016-02-18 22:26:39

标签: database database-design

我是stakoverflow的新手。我有很多研究,我不认为我已经找到了我需要的信息。我希望我不会问一些已被涵盖的内容或混合问题。

我需要收集服务全世界的客户地址。我看了几个饲料已经帮助了我很多,但我仍然需要建议。 最初我打算创建一个客户表(id,customer_account,name,email) 将包含的地址表(id,fk_customer_id,地址line1,line2,city,fk_province-id,fk_country_id)

我的困境来自于世界实际拥有的地址结构的差异。所以我想问一些具体的设计和规范化问题。

我认为这就是我想要的客户表(id,customer_account,名称,电子邮件,国家/地区)以后可以使用该国家来改进格式化输出,以防万一这样的事情需要在未来(依靠扩张)

就地址而言,我认为我想要考虑的选项很少,但不确定哪一个最好。 (所有选项将使用相同的客户表结构)

1)使用美国驱动的地址表和无美国驱动的表

US表看起来像US_address(address_id,fk_customer_id,line1,line2,city,fk_state_id,zipcode,fk_type_id)

地址表2 (addres_id,fk_customer_id,line1,line2,line3,line4,city,postal,fk_type_id)

国家/地区ID将是我将选择或加入美国或非美国的表格的决定因素。 注意:type_id会告诉我这是一个送货地址或帐单地址,甚至可能是家里,商家只是作为一个例子

2)使用一个地址表,但添加一个子表来表示我很喜欢行但是它需要加入(我不认为加入是一件坏事(如果我错了请纠正我)并且它还要求插入在一个事务中,将数据插入到3个这样的表中 客户 - >获取id并插入地址 - >获取id并插入行

设计看起来像这样: 地址(addres_id,city,province / state,postal_code,address_type) ADDRESS_LINES(ADDRESS_ID,ADDRESS_LINE,LINE_NUMBER) 这将允许我有地址线与水平表示的垂直表示,而不是(addres_id,fk_customer_id,line1,line2,line3,line4,city,postal,fk_type_id) 对于大多数情况,第2,3和4行将为空,我将根据需要添加地址行,并且连接将返回特定address_id的所有行,这可以给出1,2或4行

我喜欢2,非常感谢您的意见。我想知道你对结构,性能,标准化和设计等的看法......等等

此外,如果我选择选项2,这是否足够标准化,还是需要进一步规范化。即如果它也是一个表,该省可能有很多冗余数据?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++

该数据库将为在线用户提供服务。 我不想看看我是否应该将地址分成自己的表格。我主要担心的是拥有一个对世界普遍存在的解决方案。地址格式从一个国家变为另一个国家,因此我想要一个简单的解决方案,这个解决方案足够复杂但不太复杂,因为我希望它也方便用户使用。我想把它全部分解成很多领域,但我认为解决方案不会让在线表格变得容易。 我想输入我当前的选项1或2。 我添加line1,line2,line 3的原因是为了简化用户界面,同时我仍然为国际用户提供服务。用户可能必须提供楼层号或楼层号,但我不必指定或询问具体信息。 (我正在考虑网上流行的在线数据收集和表格格式。)

1 个答案:

答案 0 :(得分:0)

我认为你应该有一个标准化的地址表,如:

CREATE TABLE [dbo].[Address](
    [Address_Line1] [nvarchar](150) NOT NULL,
    [Address_Line2] [nvarchar](50) NOT NULL,
    [City] [nvarchar](50) NULL,
    [Province] [int] NOT NULL,
    [Country] [int] NOT NULL,
    [Postal_Code] [nvarchar](10) NOT NULL,
    [Type] [char](1) NOT NULL,
    [Room] [varchar](50) NULL,
    [Floor] [varchar](50) NULL,
    [Cross_Street] [varchar](255) NULL,
    [Street_No] [varchar](20) NULL,
    [Street_Suffix] [varchar](10) NULL,
    [Unit_Suit_Appt] [varchar](50) NULL,
    [Street_Name] [varchar](255) NULL,
    [Street_Type] [varchar](50) NULL,
    [Street_Direction] [varchar](20) NULL,
    [PoBox] [varchar](50) NULL,
)

省和国家是FK到省和国家表预先填充。 根据您的需要,随意使用/不使用其他字段。