SQL Server 2012很多家长加入表?

时间:2013-09-14 03:44:52

标签: sql-server database-design join foreign-keys jointable

我有一个表(下面例子中的“#detail”),它与三个表中的一个表有一个子关系(总是一个表而不是其他表)。例如,#archtail'aaaa'和'bbbb'需要一个与#metainfo1相关的列值,row1和row'cccc'需要与#metainfo2.row1相关,'dddd'需要与#metainfo3相关, ROW1。

我不想在#detail中为每个#metainfo表创建一个新列,因为 我将不得不添加新的#detail列,因为在数据库的生命周期中添加了新的#metainfo表,并且#detail中的每一行将至少有2个空值(并且随着#metainfo的增长,更多的空列)。

我考虑过在#detail和#metainfo表之间创建一个连接/连接表,但这似乎只是移动了过多的空列和 将工作扩展到另一个表(并添加额外的IO)。

有人可以推荐一种让这种多父关系有效的方法吗?

感谢。

create table #detail (detailid int identity(1,1) primary key , detailinfo varchar(4) )
create table #metainfo1 (meta1id int primary key )
create table #metainfo2 (meta2id int primary key)
create table #metainfo3 (meta3id int primary key)
insert into #detail 
   select 'aaaa' union select 'bbbb' union select 'cccc' union select 'dddd'
insert into #metainfo1 
   select 1 
insert into #metainfo2
   select 1 
insert into #metainfo3
   select 1 

1 个答案:

答案 0 :(得分:1)

我建议您对数据进行规范化,以便将metainfo合并到一个表中。我们把图表放在一起:

MetaInfotypes (parent) --1-to-many--> MetaInfo (child)
MetaInfo (parent) --1-to-many--> Detail (child)

这意味着:一个或多个细节将与MetaInfo相关。一个或多个MetaInfo将与Type相关联。

让我们看一下表结构:

-- Example: MetaInfo1, MetaInfo2, MetaInfo3
create table MetaInfoTypes (
  id int identity(1, 1) primary key, 
  name varchar(20), 
  constraint uk_MetaInfoTypes_name unique(name)
);

create table MetaInfo (
  id int identity(1,1) primary key,  
  MetaInfotypeid int,
  somevalue varchar(100),
  foreign key (MetaInfotypeid) references MetaInfoTypes(id)
);

create table detail (
  detailid int identity(1,1) primary key, 
  detailinfo varchar(4),
  MetaInfoid int,
  foreign key (MetaInfoid) references MetaInfo(id)
);

使用虚拟数据

查看此SQLFiddle

这样您就不必添加MetaInfo表。您只需将数据推送到MetaInfo表中,然后限定MetaInfo的类型即可。要轻松添加类型,我们有MetaInfoTypes表。然后,只需将详细信息与选择的元信息相关联即可。

当必须添加新的元信息时,将其添加到MetaInfoType。然后为该类型的MetaInfo添加数据。然后将数据添加到详细信息并引用MetaInfo的Id。