2010-03-12 4 views
3

Quelle est la meilleure façon de stocker des données de nature dynamique en utilisant MySQL? Disons que j'ai une table dans laquelle un élément est "dynamique". Pour certaines entrées, j'ai besoin de stocker une valeur, mais pour d'autres, cela peut être une centaine de valeurs. Par exemple, disons que j'ai une table simple:Baies multidimensionnelles MySQL

CREATE TABLE manager 
( 
name char(50), 
worker_1_name(50), 
worker_2_name(50), 
... 
worker_N_name(50) 
); 

De toute évidence, ce n'est pas un moyen idéal pour mettre en place une base de données. Parce que je dois accueillir le plus grand groupe qu'un gestionnaire pourrait potentiellement avoir, je gaspille beaucoup d'espace dans la base de données. Ce que je préférerais est d'avoir une table que je peux utiliser en tant que membre d'une autre table (comme je le ferais en C++ via l'héritage) qui peut être utilisée par la table "manager" pour gérer le nombre variable d'employés. Cela pourrait ressembler à ceci. Je voudrais être en mesure d'ajouter un nombre variable de travailleurs à chaque gestionnaire. Est-ce possible ou suis-je contraint d'énumérer tout le nombre possible d'employés même si je n'utiliserai que rarement l'effectif complet?

Répondre

1

En général, vous devez faire quelque chose comme ce qui suit:

CREATE TABLE managers ( 
    manager_id int, 
    name  char(50) 
); 

CREATE TABLE workers (
    name  char(50), 
    manager_id int 
); 

Voici comment vous devez représenter « un nombre variable de travailleurs » dans le relation model.

+0

Ceci est spécifiquement [normalisation de la base de données] (http://en.wikipedia.org/wiki/Database_normalization). Il est mentionné dans ce lien de modèle de relation, mais c'est une page assez grande pour le trouver. – phazei

0

Vous pouvez utiliser une colonne ID pour garder une trace des travailleurs sous forme d'enregistrements dans la même table.

CREATE TABLE manager 
(
name char(50), 
id int 
); 

CREATE TABLE WORKERS 
(
managerID int, 
name char(50) 
); 

Allow managerIDs double dans travailleur ... quand vous voulez obtenir des travailleurs spécifiques à un gestionnaire, simplement SELECT Nom DES TRAVAILLEURS où ManagerID = ID et il retournera tous les travailleurs de ce gestionnaire. Si vous avez besoin de recherches plus complexes, vous pouvez également utiliser Joins.

0

Vous pouvez attribuer un identifiant autoincrement au directeur, et lier les travailleurs à l'aide d'une clé étrangère:

manager 
    id 
    name 

worker 
    id 
    manager_id 
    name 
0

Vous pouvez créer une table de correspondance intermédiaire. Quelque chose comme ce qui suit:

manager(id, name) 
managerWorkerMapping(managerId, workerId) 
worker(id, name) 

Maintenant, pour obtenir tous les travailleurs pour un gestionnaire particulier, vous pouvez exécuter la requête suivante:

select w.name from worker w, manager m, managerWorkerMapping mwm 
where m.name = 'manager name' and 
     m.id = mwm.managerid and 
     mwm.workerId = w.id 

Il est important de noter que ce schéma, il est possible pour les travailleurs d'avoir plusieurs gestionnaires aussi bien.

0
select w.name from worker w, manager m, managerWorkerMapping mwm 
where m.name = 'manager name' and 
     m.id = mwm.managerid and 
     w.id = mwm.workerId 
+0

Pourriez-vous fournir quelques explications pour aller avec cela? Qu'est-ce que vous avez fait qui est fondamentalement différent et pourquoi c'est la solution pour le PO? – corsiKa

+0

@cliff - bien que l'instruction de la requête soit utile, pensez à l'ajouter à la réponse existante. En soi, il ne répond pas à la question posée par le PO. –

+0

Exemplaire exact de [l'autre réponse] (http://stackoverflow.com/a/2433788/1402846). – Pang

Questions connexes