MySQL中的多对多架构?

时间:2010-02-17 17:39:37

标签: mysql schema

现在我有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。但salarieconsultant是不同的角色。

我认为我应该修改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
} 

非常感谢。

2 个答案:

答案 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)