2008-11-13 5 views
5

Comment une base de données relationnelle doit-elle être conçue pour gérer des attributs à plusieurs valeurs?Attributs à valeurs multiples dans les bases de données

modifier: Pour élaborer:

Il y a deux façons que je pouvais penser pour ce faire -

  1. essayer quelque chose comme mettre des valeurs séparées par des virgules dans le champ, ce qui semble un peu maladroit.
  2. Créez une autre table pour le champ et laissez les valeurs multiples aller au champ. Cela peut conduire à un très grand nombre de tables, si j'ai trop de champs de ce type.

La question est:

  1. Y at-il plus de façons de gérer cela?
  2. Laquelle des deux méthodes ci-dessus est généralement utilisée?

Merci à l'avance

+0

Vous devez être beaucoup plus explicite que cela. Je suppose que l'anglais n'est peut-être pas votre langue maternelle, mais essayez-le. Les gens essaieront d'aider et certains régleront votre question, mais vous devez nous donner quelque chose pour continuer. –

Répondre

1

est la relation un à plusieurs ou plusieurs à plusieurs? Avec la relation un-à-plusieurs, je recommande une clé étrangère dans la table enfant (le plus grand) référençant la table parent (l'un). Avec une relation plusieurs-à-plusieurs, votre meilleur pari sera probablement une table séparée avec des clés étrangères pour le parent et l'enfant.

12

Dans la conception de base de données relationnelle classique, chaque colonne & doit stocker une seule valeur. Ne stockez pas les listes séparées par des virgules ou quelque chose de farfelu comme ça. Par exemple, disons qu'une équipe sportive compte sept membres. Vous pouvez le faire:

CREATE TABLE team (
    team_id  INT PRIMARY KEY, 
    team_name VARCHAR(50), 
    team_members VARCHAR(200) 
); 
INSERT INTO team VALUES (1,'Dwarfs', 'Sleepy,Dopey,Sneezy,Happy,Grumpy,Doc,Bashful') 

Mais il est préférable de le faire:

CREATE TABLE team (
    team_id  INT PRIMARY KEY, 
    team_name VARCHAR(50), 
); 
INSERT INTO team (team_name) VALUES ('Dwarfs'); 

CREATE TABLE team_members (
    team_id  INT, 
    member_name VARCHAR(20), 
    FOREIGN KEY (team_id) REFERENCES team(team_id) 
); 
INSERT INTO team_members VALUES 
    (LAST_INSERT_ID(), 'Sleepy'), 
    (LAST_INSERT_ID(), 'Dopey'), 
    (LAST_INSERT_ID(), 'Sneezy'), 
    (LAST_INSERT_ID(), 'Happy'), 
    (LAST_INSERT_ID(), 'Grumpy'), 
    (LAST_INSERT_ID(), 'Doc'), 
    (LAST_INSERT_ID(), 'Bashful'); 

nb:LAST_INSERT_ID() est une fonction MySQL. Des solutions similaires sont disponibles dans d'autres marques de base de données.

+0

LAST_INSERT_ID est-il lié à une table? ou est-ce un numéro unique dans la base de données? –

+0

Dans MySQL, les valeurs d'auto-incrément sont liées à une table, il n'y a pas d'objet de séquence comme dans Oracle ou PostgreSQL. Mais LAST_INSERT_ID() renvoie la valeur la plus récente générée par un INSERT, quelle que soit la table que vous avez utilisée, ce qui le rend utile pour remplir les tables enfant. –

+2

Il convient également de noter que LAST_INSERT_ID() et mysql_insert_id() dans l'API sont par connexion. c'est-à-dire que la valeur provient de la dernière insertion sur cette connexion, et non de la totalité de la base de données. –

1

Si vous êtes limité à travailler avec une base de données strictement relationnelle, vous devez stocker ces valeurs sous la forme de lignes dans une table. Et c'était votre question - comment le faire avec une base de données relationnelle. Cependant, il existe de nombreuses bases de données qui fournissent un stockage natif de plusieurs valeurs dans un champ, ce qui s'avère être une très bonne correspondance avec beaucoup de données réelles, facile à programmer et plus simple à comprendre (sans l'explosion des tables). avec la 3ème forme normale). Pour plus d'informations, consultez http://en.wikipedia.org/wiki/MultiValue http://en.wikipedia.org/wiki/IBM_U2 http://en.wikipedia.org/wiki/InterSystems

Questions connexes