Схема для многих для многих в MySQL? - PullRequest
2 голосов
/ 17 февраля 2010

Теперь у меня есть 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)
 );

Контекст: A salarie может иметь разные experience с, а consultant может иметь разные experience с.Но salarie и consultant - это разные роли.

Я думаю, что я должен изменить таблицу experience, потому что она имеет два столбца salarie_id int(11), consultant_id int(11).

Что мне делать?

Редактировать:

Я думаю, что это отношения один-ко-многим.Потому что один консультант / салари может иметь столько же опыта, а один опыт принадлежит только одному консультанту / салари.Я прав?

Но я думаю, что опыт работы с таблицами не должен содержать столбцы salarie_id int (11) и consultant_id int (11) одновременно.

Как вы думаете?

И если это отношения многие ко многим.Как насчет краткого последующего проектирования?

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 ]

3 голосов
/ 17 февраля 2010

Как я понимаю, вы хотите, чтобы у салари и консультанта было много опыта, но один конкретный опыт не должен принадлежать нескольким различным консультантам / зарплатам. Поэтому я думаю, что вы разработали его правильно, но, возможно, вам следует установить ограничения внешнего ключа для salarie_id и consultant_id в таблице опыта.

Однако, возможно, у вас есть сотрудники, у которых, в свою очередь, есть роли. Например:

альтернативный текст 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 голос
/ 17 февраля 2010

Если я правильно понял, это отношение M: M (http://en.wikipedia.org/wiki/Many-to-many_%28data_model%29), и вам нужна соединительная таблица или таблицы, например, consultant_experience (consultant_id, experience_id)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...