我有一个表(下面例子中的“#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
答案 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。