-1

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

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
);

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

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

4

2 回答 2

1

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

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

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

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

于 2013-04-29T16:38:37.970 回答
0

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

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

优点:

  • 它有助于保持数据清洁。
  • 根据计划如何使用数据库以及您正在使用哪个数据库,如果预先为连接定义了外键,某些数据库往往会更好地优化连接。

缺点:

  • 如果您计划经常批量加载到您的表中,那么 FK 约束往往会减慢您的加载速度,如果是这种情况,一些数据库允许您定义软约束,这些软约束仅用于查询优化目的,但在运行期间未验证负载。
于 2020-07-07T17:33:13.973 回答