Oracle外键或主键

时间:2013-04-29 16:04:04

标签: oracle foreign-keys ddl primary-key-design

我在使用主键或外键时有点困惑。我有两个表,在这两个表中,一些列引用了作为其他表中主键的列。 他们在这里:

CREATE TABLE roles (
movie_id NUMBER(10,0) NOT NULL REFERENCES movies(movie_id),
actor_id NUMBER(10,0) NOT NULL REFERENCES actors(actor_id),
movie_description VARCHAR2(50),
salary NUMBER(10),
CONSTRAINT pk_roles PRIMARY KEY (movie_id, actor_id)
);

CREATE TABLE profits (
movie_id NUMBER(10,0) NOT NULL,
gross_profit NUMBER(9) NOT NULL,
net_profit NUMBER(9) NOT NULL,
CONSTRAINT fk_profits FOREIGN KEY (movie_id) REFERENCES movies(movie_id) ON DELETE CASCADE
);

在第一个表中,我从两列中创建了一个复合主键,该列引用了其他表中的列。这些列恰好是各自表中的主键。

在第二个表中,我再次引用了一个外键,引用了另一个表中的主键。但什么是最佳做法?第一个表中的键是否也应该是外键,因为它引用了其他表中的主键?

2 个答案:

答案 0 :(得分:1)

主键约束和唯一约束可防止重复行。重复的行不仅浪费空间,而且更难以从数据库中获得有意义的答案。

外键约束将值限制为另一个表中存在的值。外键约束的目标通常是主键,但它可以是具有唯一约束的任何列。

每个表都应该有一个主键约束。如果构成主键的列也需要外键约束,那么也要添加外键约束。

就实现主键约束和外键约束而言,您的表“角色”很好。但“利润”需要一把钥匙。

答案 1 :(得分:0)

对于您的问题“第一个表中的键是否也应该是外键,因为它引用了其他表中的主键?”

没有简单的答案,因为它很大程度上取决于计划使用的数据类型和所使用的数据库。如果您需要一个简单的答案,是的,这是个好主意。下面是更长的版本。

优点:

  • 它有助于保持数据干净。
  • 如果预先定义了用于联接的外键,则根据计划使用数据库的方式以及所使用的数据库,某些数据库会更好地优化联接。

缺点:

  • 如果您打算频繁地将大量数据加载到表中,则FK约束会减慢加载速度,如果是这种情况,则某些数据库允许您定义软约束,这些软约束仅用于查询优化目的,但加载期间未验证。