当我们创建父子表时,子表是否需要自己的主键,或者父表的外键是否应该用作主键?
示例:
我有一个存储用户的表,其定义如下:
CREATE TABLE users (
'id' bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
'username' varchar(32),
PRIMARY KEY ('id'))
我想创建第二个表,其中存储有关用户的更多信息,例如他们最喜欢的动物。该表是否应该有自己的“id”列以及链接用户的单独外键?:
CREATE TABLE users_extra_info (
'id' bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
'fk_user_id' bigint(20) UNSIGNED NOT NULL,
'fav_mammal' varchar(32),
'fav_reptile' varchar(32),
...
PRIMARY KEY ('id'),
KEY 'fk_user_id' ('fk_user_id'))
或者您通常只删除'id'列,因为外键必须是唯一的?:
CREATE TABLE users_extra_info (
'fk_user_id' bigint(20) UNSIGNED NOT NULL,
'fav_mammal' varchar(32),
'fav_reptile' varchar(32),
...
PRIMARY KEY ('fk_user_id'))
由于
答案 0 :(得分:2)
作为一个原则问题,与其他表无关,每个表应该有一个PRIMARY KEY
,以便您能够区分一行与另一行。虽然并不总是需要绝对识别通常需要的单个行。
如果存在真正的一对一关系(或一对一或零关系,也会发生),因为外键必然是唯一的,它也可以用作主键子公司表。在这种情况下,完全没有理由引入第二个唯一列。
然而,一对一和一对一或一对一关系不如一对多关系那么常见。在更常见的情况下,您不能仅使用外键列作为主键,因为它们在子表中不是唯一的。在这种情况下,您可以选择引入其他整数键或使用外键列和一个或多个其他列创建复合主键,这些列一起保证是唯一的。
答案 1 :(得分:0)
您必须了解规范化规则。
这里是链接http://www.studytonight.com/dbms/database-normalization.php。
答案 2 :(得分:0)
如果要将其他列放到另一个表中,我看不出有额外id列的原因。以下是我要做的事情。这种方法的另一个好处是可以确保一对一的关系。如果您有一个单独的ID列,那么您可以将users_extra_info中的许多行链接到用户的一行。
CREATE TABLE users (
id int,
username varchar(32),
PRIMARY KEY (id));
CREATE TABLE users_extra_info (
fk_user_id int,
fav_mammal varchar(32),
fav_reptile varchar(32),
PRIMARY KEY (fk_user_id),
foreign key (fk_user_id) references users(id));
您还可以考虑级联删除。