2010-02-17 8 views
2

Maintenant, j'ai 3 tables qui sont:Schéma pour plusieurs à MySQL?

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) 
); 

Le contexte: Un salarie peut avoir différentes experience s et consultant peuvent avoir différentes experience s. Mais salarie et consultant sont des rôles différents.

Je pense que je devrais modifier experience table, car il a deux colonnes salarie_id int(11), consultant_id int(11).

Que dois-je faire?

Edit:

Je pense qu'il est un à plusieurs. Parce qu'un consultant/salarie peut avoir autant d'expériences, et une seule expérience appartient à un consultant/salarie. Ai-je raison?

Mais je pense que l'expérience table ne doit pas contenir les colonnes salarie_id int (11) et consultant_id int (11), en même temps.

Qu'en pensez-vous?

Et si c'est une relation plusieurs-à-plusieurs. Qu'en est-il du breif suite à la conception?

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 
} 

Merci beaucoup.

+0

Pouvez-vous donner un exemple d'une ligne dans salarie? – chelmertz

+0

Que voulez-vous dire? –

+0

Cela n'a pas de sens pour moi qu'une expérience puisse appartenir à plus d'un consultant ou salaire. Est-ce vraiment ce que tu veux? –

Répondre

1

si je comprends bien, c'est un M: M relation (http://en.wikipedia.org/wiki/Many-to-many_%28data_model%29) et vous avez besoin d'une table de jonction ou des tables, comme consultant_experience (consultant_id, experience_id)

+0

@thanks stereofrog, mais je pense que c'est une relation un-à-plusieurs. parce qu'un consultant/salarie peut avoir autant d'expériences, et une seule expérience appartient à un consultant/salarie. Ai-je raison? –

+0

si un consultant et/ou des salaires a plusieurs expériences. Comment puis-je gérer cela? –

3

Si je comprends bien, vous voulez salarie et consultant pour être en mesure d'avoir de nombreuses expériences mais une expérience particulière ne devrait pas appartenir à plusieurs consultants/salaires différents. Par conséquent, je pense que vous l'avez conçu correctement, mais vous devrez peut-être définir des contraintes de clé étrangère sur salarie_id et consultant_id dans la table d'expérience. Cependant, il se peut que vous ayez plutôt des employés qui, à leur tour, ont des rôles. Par exemple:

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; 
+0

@leson, merci beaucoup pour votre suggestion. Mais je n'ai pas trouvé le consultant de table dans votre solution. Que puis-je faire pour cette table? –

+0

@ garcon1986: L'idée est de transformer à la fois le salaire et le consultant en rangées dans la table Rôle. Ensuite, vous créez des employés qui ont un ou plusieurs rôles (peut-être y a-t-il plus de rôles qu'un salaire/consultant qu'un employé peut avoir?) Et une ou plusieurs expériences. –

Questions connexes