为多值属性创建表

时间:2014-10-29 16:23:35

标签: sql database-design mysqli foreign-keys

我有一张桌子" DEPARTMENT"它有多个位置。我为地点创建了另一张桌子" DEPARTMENT_LOCATIONS"。

请注意" Dnumber"是DEPARTMENT的主键,我想在" DEPARTMENT_LOCATIONS"内使用相同的密钥。

我的代码是对还是错?以及如何解决它?

create table if not exists DEPARTMENT(
    Dname varchar(100) not null,
    Dnumber int unsigned not null,
    primary key (Dnumber)
);
create table if not exists DEPARTMENT_LOCATIONS(
    Location nvarchar(1000) not null default'',
    Dnumber int unsigned not null references DEPARTMENT(Dnumber) on delete cascade,
    primary key (Dnumber)
);

2 个答案:

答案 0 :(得分:1)

根据您的说法,部门可以有多个地点。如果您尝试将dnumber设置为两个部门和位置的主键,则位置本身与部门之间存在1对1的关系,而不是您想要的1对1 - 因为主键必须是唯一的。

您仍然可以将DNumber作为您的FK引用,但您需要一个单独的主键。要么是唯一的int(类似于你为部门做的事情),要么是Dnumber和位置之间的复合键。我个人并不是复合键的粉丝,所以我通常只会在这个例子中做一个自动增量号。

这样的事情:

create table if not exists DEPARTMENT(
    Dname varchar(100) not null,
    Dnumber int unsigned not null,
    primary key (Dnumber)
);

create table if not exists DEPARTMENT_LOCATIONS(
    Location nvarchar(1000) not null default'',
    Dnumber int unsigned not null,
    myKey int unsigned not null,
    primary key (myKey),
    foreign key(Dnumber) references DEPARTMENT (Dnumber) on delete cascade
);

请注意,我不熟悉mysql以了解身份列的语法,因为我是MS SQL人员,但上述答案的概念应该仍然适用。

答案 1 :(得分:0)

Dnumber必须具有相同的数据类型。

create table if not exists DEPARTMENT_LOCATIONS(
    Location nvarchar(1000) not null default'',
    Dnumber int unsigned not null,
    primary key (Dnumber),
    foreign key(Dnumber) references DEPARTMENT (Dnumber) on delete cascade
);

http://sqlfiddle.com/#!2/af4c0