Sql server 2008 使用hierarchyid存储客户的地址

Sql server 2008 使用hierarchyid存储客户的地址,sql-server-2008,hierarchyid,Sql Server 2008,Hierarchyid,我有一个名为“AddressDemo”的表,用于存储具有以下字段的客户地址 CREATE TABLE [dbo].[AddressDemo]( [AddressID] [int] IDENTITY(1,1) NOT NULL, [State] [nvarchar](50) NULL, [District] [nvarchar](50) NULL, [Taluk] [nvarchar](50) NULL, [Village] [nvarchar](50) NULL, [Street1] [nvar

我有一个名为“AddressDemo”的表,用于存储具有以下字段的客户地址

CREATE TABLE [dbo].[AddressDemo](
[AddressID] [int] IDENTITY(1,1) NOT NULL,
[State] [nvarchar](50) NULL,
[District] [nvarchar](50) NULL,
[Taluk] [nvarchar](50) NULL,
[Village] [nvarchar](50) NULL,
[Street1] [nvarchar](50) NULL,
[Street2] [nvarchar](50) NULL,
[Phone] [nvarchar](50) NULL,
[Mobile] [nvarchar](50) NULL,
[Email] [nvarchar](50) NULL,
 CONSTRAINT [PK_AddressDemo] PRIMARY KEY CLUSTERED 
(
    [AddressID] ASC
))
存在层次结构的地方,类似于 州-->地区-->塔鲁克-->村庄-->街道1-->街道2

保留一个单独的表来存储层次结构不是一个好主意吗,这样我们就可以避免重复数据。以下内容如何

CREATE TABLE [dbo].[LocationDemo](
[LocationID] [int] IDENTITY(1,1) NOT NULL,
[LocationNodeID] [hierarchyid] NULL,
[Location] [nvarchar](50) NULL,
 CONSTRAINT [PK_LocationDemo] PRIMARY KEY CLUSTERED 
(
    [LocationID] ASC
))
因此“AddressDemo”将如下所示

CREATE TABLE [dbo].[AddressDemo](
[AddressID] [int] IDENTITY(1,1) NOT NULL,
[LocationID] [int] NULL,
[Phone] [nvarchar](50) NULL,
[Mobile] [nvarchar](50) NULL,
[Email] [nvarchar](50) NULL,
 CONSTRAINT [PK_AddressDemo] PRIMARY KEY CLUSTERED 
(
    [AddressID] ASC
))

和地址演示的
LocationID
参考LocationDemo的
LocationID

虽然您提出的解决方案比您描述的扁平化解决方案更具动态性,但在这种情况下,我不会对位置使用完全动态的模式。添加层次化处理不是没有充分理由的事情,因为它会使以后的数据库查询复杂化,并限制性能优化的备选方案(包含CTE的视图无法编制索引,您需要视图来合理地使用应用程序的此数据)

如果你说的是一个低容量系统,或者是一个存储地址数量很少的系统,你可以使用动态地址元素路由,但是考虑到没有大多数位置元素,没有一个地址在逻辑上是不存在的,我会再次说这是一种过分的做法


选择一条更为规范的路线,而不必过火。考虑从地址、区域表和FK等方面对该表进行状态表和FK。

我希望避免创建多个表(这是一个旧方法)。将关系数据库模式规范化到适当的程度永远不会过时。