Join表(关联表)是否有主键?多对多的关系

时间:2010-06-22 10:59:00

标签: php sql mysql sql-server oracle

Join表(关联表)是否有主键?多对多的关系。我已经看到一些带有主键的Join表和一些没有人可以解释当你在连接表中有一个主键时为什么?

提前谢谢你; - )

4 个答案:

答案 0 :(得分:6)

在纯'join'或联结表中,所有字段都将成为主键的一部分。例如,让我们考虑以下表格:

CREATE TABLE USERS
  (ID_USER NUMBER PRIMARY KEY,
   FIRST_NAME VARCHAR2(32),
   LAST_NAME VARCHAR2(32));

CREATE TABLE ATTRIBUTES
  (ID_ATTRIBUTE NUMBER PRIMARY KEY,
   ATTRIBUTE_NAME  VARCHAR2(64));

这些之间的联结表允许许多用户拥有许多属性

CREATE TABLE USER_ATTRIBUTES
  (ID_USER NUMBER REFERENCES USERS(ID_USER),
   ID_ATTRIBUTE NUMBER REFERENCES ATTRIBUTES(ID_ATTRIBUTE),
   PRIMARY KEY(ID_USER, ID_ATTRIBUTE));

有时您会发现需要在联结表中添加非主要列,但我发现这种情况相对较少。

分享并享受。

答案 1 :(得分:4)

所有表都应该有一个主键。 : - )

您可以使用复合外键或盲整数键。

当关联表中没有其他元素时,您将使用复合外键。

当关联表具有自己的元素时,可以使用盲整数键。复合外键将使用两个附加索引进行定义。

答案 2 :(得分:0)

这取决于您关联的记录。只要每个关联不需要多个记录,就可以在关联记录的id上创建复合主键。

但是,确保这两列都已编入索引并定义参照完整性更为重要。

答案 3 :(得分:0)

关系表经常有三个候选键,其中一个不需要用约束强制执行,而选择哪个键(如果有的话)应该是'primary'是任意的。

Joe Celko

考虑这个例子
CREATE TABLE Couples
(boy_name INTEGER NOT NULL UNIQUE -- nested key
REFERENCES Boys (boy_name),
girl_name INTEGER NOT NULL UNIQUE -- nested key,
REFERENCES Girls(girl_name),
PRIMARY KEY(boy_name, girl_name)); -- compound key
  

“情侣”表可让您插入   来自原始集合的这些行:

('Joe Celko', 'Brooke Shields')
('Alec Baldwin', 'Kim Bassinger')
     

想一下这张桌子。   PRIMARY KEY现在是多余的。如果   每个男孩只出现一次   桌子和每个女孩只出现一次   在表中,然后每个(boy_name,   girl_name)对只能出现一次。

     

从理论的角度来看,我可以   丢弃复合键并制作其中一个   boy_name或girl_name新的主要   关键,或者我可以留下它们   候选人密钥。

     

SQL产品和理论并不总是如此   比赛。很多产品都有   假设PRIMARY KEY在   某种特殊的数据模型和方式   将是访问该表的方式   大多数时候。

...然而,我怀疑你的问题意味着更多的东西,“假设我是那种倾向于自然键而不是人工识别器的人,我应该在一个完全由从其他表引用的人工标识符?“