是否需要单个表的原因是,您希望确保当六个父表引用保证为相同实例的子行的给定实例?这是经典的“多亲”问题。您可能遇到的一个例子是地址或电话号码与多个人/联系人表。
我能想到几个选项:
选择1:每个父表的链接表。这将是Hoyle架构。所以,像这样:
Create Table MyTable(
id int not null Primary Key Clustered
, info1 varchar(50) null
, info2 varchar(50) null
, info3 varchar(50) null
)
Create Table LinkTable1(
MyTableId int not null
, ParentTable1Id int not null
, Constraint PK_LinkTable1 Primary Key Clustered(MyTableId, ParentTable1Id)
, Constraint FK_LinkTable1_ParentTable1
Foreign Key (MyTableId)
References MyTable (Id)
, Constraint FK_LinkTable1_ParentTable1
Foreign Key (ParentTable1Id)
References ParentTable1 (Id)
)
...
Create Table LinkTable2...LinkTable3
选择2.如果你知道,你永远不会有超过说的六个表,并愿意接受一些非规范化和设计的fugly,你可以增加6个外键的主表。这样可以避免填充一堆链接表的问题,并确保正确的引用完整性。但是,如果父母的数量增加,那么这种设计可能会很快失去控制。
如果您满足于您现有的设计,那么就字段大小而言,我会使用完整的表名称。坦率地说,char(3)和varchar(50)甚至varchar(128)之间的性能差异对于您可能放入表中的数据量而言可以忽略不计。如果你真的认为你将拥有数百万行,那么我会强烈考虑链接表的选项。
如果您想保持您的设计并希望获得最佳性能,那么我将使用带有外键的tinyint指向包含带tinyint主键的六个表的列表的表。这可以防止数字变得“魔术”,并确保您缩小父表的列表。当然,它仍然不能防止孤立的记录。在这个设计中,你必须使用触发器来做到这一点。
表定义的第一行是什么意思? ** int id int FK_id varchar(50)** – 2010-02-18 19:30:20
因此,FK值可以是6个其他表中的1个PK? – 2010-02-18 19:31:39
@KM这意味着编辑找到了我。现在修复它。 @iKnowKungFoo正确。这是因为它在每个表中都是相同的信息,但我需要能够访问它的任何一个,而不必将6个表中的每个表联合起来。 – corymathews 2010-02-18 19:33:13