Database 数据库设计和解决垂直与水平问题

Database 数据库设计和解决垂直与水平问题,database,database-design,Database,Database Design,我是斯塔科弗流的新手。我做了很多研究,但我认为我没有找到我需要的信息。我希望我不是在问一些已经讨论过的问题,也不是在问一些混杂的问题 我需要在全世界收集该服务的客户地址。我已经查看了一些提要,它们对我帮助很大,但我仍然需要建议。 最初我打算创建一个customer表(id、customer\u account、name、email) 将包含的地址表(id、fk_客户id、地址行1、行2、城市、fk_省id、fk_国家id) 我的困境来自于世界上不同的称呼结构。所以我想问一些具体的设计和规范化问题

我是斯塔科弗流的新手。我做了很多研究,但我认为我没有找到我需要的信息。我希望我不是在问一些已经讨论过的问题,也不是在问一些混杂的问题

我需要在全世界收集该服务的客户地址。我已经查看了一些提要,它们对我帮助很大,但我仍然需要建议。 最初我打算创建一个customer表(id、customer\u account、name、email) 将包含的地址表(id、fk_客户id、地址行1、行2、城市、fk_省id、fk_国家id)

我的困境来自于世界上不同的称呼结构。所以我想问一些具体的设计和规范化问题

我想这就是我想要的客户表(id、客户账户、姓名、电子邮件、国家)国家/地区可以在以后用于改进格式化输出,以防将来需要这样的东西(依靠扩展)

就地址而言,我没有什么选择,我想我想考虑一下,但不确定哪一个是最好的。(所有选项将使用相同的客户表结构)

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

美国表格将看起来像美国地址(地址id、fk客户id、第1行、第2行、城市、fk州id、zipcode、fk类型id)

地址表2(地址id、fk客户id、第1行、第2行、第3行、第4行、城市、邮政、fk类型id)

国家id将是我选择或加入美国或不加入美国的决定因素。 注意:输入_id将告诉我它是否是发货地址或账单地址,甚至可能是家庭、企业,仅举一个例子

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

看起来像这样的设计: 地址(地址id、城市、省/州、邮政编码、地址类型) 地址行(地址id、地址行、行号) 这将允许我使用地址行的垂直表示与水平表示,而不是(地址id、fk客户id、第1行、第2行、第3行、第4行、城市、邮政、fk类型id) 在大多数情况下,第2行、第3行和第4行将为空,我将根据需要添加一个地址行,联接将返回特定地址id的所有行,该地址id可以给出1行、2行或4行

我喜欢2,非常感谢您的意见。我想知道您对结构、性能、规范化和设计等方面的看法

此外,如果我选择选项2,这是否足够规范化,或者我是否需要进一步规范化。例如,该省可能有大量冗余数据,是否也应该是一个表

++++++++++++++++++++++++++更新++++++++++++++++++++++++++

该数据库将为在线用户服务。 我不想看我是否应该把地址分成自己的表格。我主要关心的是有一个世界通用的解决方案。地址格式从一个国家变为另一个国家,所以我想要一个简单的解决方案,它足够复杂,但不太复杂,因为我也希望它对用户友好。我想把它全部分解有这么多的字段,但我认为这个解决方案不会使在线表单变得容易。 我想输入我当前的选项1或2。
我添加第1行、第2行和第3行的原因是为了简化用户界面,同时我仍然为国际用户提供服务。用户可能需要提供楼层号或建筑号,但我不需要指定楼层号或询问具体信息。(我正在考虑网络上流行的在线数据收集和表单格式。)

我认为您应该有一个规范化的地址表,如:

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到省和国家表,省和国家表是预先填充的。
根据您的需要,可以随意使用/不使用其他字段。

的可能重复项看看这个问题:我认为它解决了您的问题。谢谢您的输入,但这个问题没有回答我的问题。我已经将地址分解为一个速度表,但我想看看是否应该进一步分解地址表e、 州和市可能已经进入另一个表中,因此我主要关心的是,由于我处理的是不同于美国的国际地址,我如何才能有一个既适合这两个地址又不损失性能的通用解决方案?最好有选项1(两个地址表)或者选项2一个表格不同的格式?我的观点是,你已经走错了路。在我看来,你的问题是:“我应该走错一半的路,还是走错一条路?”正如你已经注意到的,地址格式在世界各地都有很大的不同。将它们塞进一个结构中总是意味着给某个地方带来不便。此外,你说你想“让在线表单变得容易”。有什么比单个多行文本框更容易?有一些工具可以解析、标准化和格式化地址。通过其中一个工具,可以在(和如果)时将地址分解为多个部分你需要这样做。让你的用户休息一下,让他们以他们喜欢的格式输入他们的地址。根据多年的经验,我可以告诉你,他们无论如何都会这样做,不管你如何试图通过在输入表单上使用单独的字段来强迫他们解析他们的地址。