现在我有3个表:
CREATE TABLE IF NOT EXISTS experience(
experience_id int(11) NOT NULL AUTO_INCREMENT,
salarie_id int(11),
consultant_id int(11),
post varchar(255),
entreprise_name varchar(255),
start_time varchar(255),
end_time varchar(255),
description varchar(10000),
PRIMARY KEY(experience_id)
);
CREATE TABLE IF NOT EXISTS salarie(
salarie_id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255),
PRIMARY KEY(salarie_id)
);
CREATE TABLE IF NOT EXISTS consultant(
consultant_id int(11) NOT NULL AUTO_INCREMENT,
nom varchar(255),
PRIMARY KEY(consultant_id)
);
上下文:salarie
可以有不同的experience
,而consultant
可以有不同的experience
。但salarie
和consultant
是不同的角色。
我认为我应该修改experience
表,因为它有两列salarie_id int(11), consultant_id int(11)
。
我该怎么办?
编辑:
我认为这是一对多的关系。因为一个顾问/ salarie可以拥有多少经验,而一个经验只属于一个顾问/ salarie。我对吗?
但我认为表体验不应同时包含salarie_id int(11)和consultant_id int(11)。
你怎么看?如果这是多对多的关系。设计后的breif怎么样?
CREATE TABLE IF NOT EXISTS consultant{
c_id int(10) NOT NULL AUTO_INCREMENT,
primary key(c_id)
}
CREATE TABLE IF NOT EXISTS salarie{
s_id int(10) NOT NULL AUTO_INCREMENT,
primary key(s_id)
}
CREATE TABLE IF NOT EXISTS experience{
e_id int(10) NOT NULL AUTO_INCREMENT,
primary key(e_id)
}
CREATE TABLE IF NOT EXISTS salarie_experience{
se_id int(10) NOT NULL AUTO_INCREMENT,
s_id int(10),
e_id int(10),
primary key(se_id),
foreign key(s_id) references salarie(s_id) on delete cascade,
foreign key(e_id) references experience(e_id) on delete cascade
}
CREATE TABLE IF NOT EXISTS consultant_experience
ce_id NOT NULL AUTO_INCREMENT,
c_id int(10),
e_id int(10),
primary key(ce_id),
foreign key(c_id) references consultant(c_id) on delete cascade,
foreign key(e_id) references experience(e_id) on delete cascade
}
非常感谢。
答案 0 :(得分:3)
据我所知,您希望薪水和顾问能够获得许多经验,但是一个特定的经历不应该属于几个不同的顾问/薪水。因此,我认为您正确设计了它,但也许您应该在体验表中的salarie_id和consultant_id上设置外键约束。
但是,您可能更愿意让员工反过来担任角色。例如:
alt text http://img16.imageshack.us/img16/9437/picture4ik.png
-- -----------------------------------------------------
-- Table employe
-- -----------------------------------------------------
DROP TABLE IF EXISTS employe ;
CREATE TABLE IF NOT EXISTS employe (
idemploye INT NOT NULL AUTO_INCREMENT ,
nom VARCHAR(255) NOT NULL ,
PRIMARY KEY (idemploye) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table experience
-- -----------------------------------------------------
DROP TABLE IF EXISTS experience ;
CREATE TABLE IF NOT EXISTS experience (
experience_id INT(11) NOT NULL AUTO_INCREMENT ,
employe_idemploye INT NOT NULL ,
post VARCHAR(255) ,
entreprise_name VARCHAR(255) ,
start_time VARCHAR(255) ,
end_time VARCHAR(255) ,
description VARCHAR(10000) ,
PRIMARY KEY (experience_id, employe_idemploye) ,
INDEX fk_experience_employe (employe_idemploye ASC) ,
CONSTRAINT fk_experience_employe
FOREIGN KEY (employe_idemploye )
REFERENCES employe (idemploye ));
-- -----------------------------------------------------
-- Table role
-- -----------------------------------------------------
DROP TABLE IF EXISTS role ;
CREATE TABLE IF NOT EXISTS role (
idrole INT NOT NULL AUTO_INCREMENT ,
employe_idemploye INT NOT NULL ,
nom VARCHAR(45) NOT NULL ,
PRIMARY KEY (idrole, employe_idemploye) ,
INDEX fk_role_employe (employe_idemploye ASC) ,
CONSTRAINT fk_role_employe
FOREIGN KEY (employe_idemploye )
REFERENCES employe (idemploye ))
ENGINE = InnoDB;
答案 1 :(得分:1)
如果我理解正确,这是一个M:M关系(http://en.wikipedia.org/wiki/Many-to-many_%28data_model%29),你需要一个或多个联结表,比如consultant_experience(consultant_id,experience_id)