基于不是主键的列创建关系?

时间:2016-06-07 22:35:44

标签: database-design foreign-keys relationship access

我有一个包含23个表的访问数据库。 有一个主表,包含所有测试设备并包含 列标题4-26。其他22个表用于容纳与部分(4-26)相关的设备。 我一直在尝试做的是设置每个节表与主表的节列标题之间的关系。如果主表的第4列中有“X”,那么也将该列自动添加到第4节表中。

由于数据已经在主表中,因此这是一种过度杀伤力。但是,我想重新阅读主表,并在我的应用程序运行时将设备分开到其中。

问题:

我已经尝试过建立关系,但是,我的“关系”类型是“不确定的”,我认为这是因为这些表没有引用彼此的主键列。

我在每个节表中创建了一个节列,表示值为4-26。然后我将其设置为我的主键,但主键(据我所知)必须是唯一的,这样才能起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

表的任何列列表都可以在其中形成外键。参考表和列列表只需引用在参考表中形成候选键的列列表。

在SQL中,PRIMARY KEY声明了一个UNIQUE NOT NULL列列表。这被称为超级钥匙。不包含较小超级密钥的超级密钥是候选密钥。主键与完整性无关紧要。规范化,候选键做。您可以将一些候选键称为主键。 (所以SQL PRIMARY KEY实际上声明了一个超级密钥,你可以称之为主超级密钥,它可能是一个候选密钥。)

外键表示如果将引用列列表中的列名替换为引用表的行中的值,则必须通过替换列中的列名来生成相同的值列表。引用列列表中引用表的行中的值。如果是这种情况,并且从引用表到引用的表中没有一串外键,则表示相同的内容然后声明外键。 (DBMS将使用该事实进行完整性和优化。)

PS (基表或查询结果的值)是否代表应用程序关系/关联。某些工具,方法和演示文稿将外键称为“关系”。

答案 1 :(得分:0)

在主表中建立主键,其中包含节值,并在节表中将其用作该表的主键和返回主表的外键。

create table TestEquipment(
    ID      AutoNumber primary key,
    Section int not null,
    ..., -- other fields common to test equipment
    constraint CK_TestEquipmentSection( Section between 4 and 26 ),
    constraint UQ_TestEquipmentLink unique( ID, Section )
);

由于ID本身就是唯一的,为什么要创建一个带ID和节值的唯一约束?所以我们可以在章节表中引用与FK的组合:

create table Section4(
    ID       int not null primary key,
    Section  int not null,
    ..., -- other fields for section 4 entries
    constraint CK_Section4 check( Section = 4 ),
    constraint FK_Section4TE foreign key( ID, Section )
        references TestEquipment( ID, Section )
};

create table Section5(
    ID       int not null primary key,
    Section  int not null,
    ..., -- other fields for section 5 entries
    constraint CK_Section5 check( Section = 5 ),
    constraint FK_Section5TE foreign key( ID, Section )
        references TestEquipment( ID, Section )
};

其他部分表将被类似地定义。输入一台测试设备时,将生成密钥值,并通过在TestEquipment中创建条目来建立区段编号。然后,只能在具有匹配部分值的节表中创建条目。也就是说,如果在TestEquipment中输入ID值为1001且Section值为4的条目,则唯一可包含ID值为1001的条目的节表将是Section4表。任何将其输入任何其他部分表的尝试都将被拒绝。

这是做出你想要做的事情的最简单方法。