2008-11-13 23 views
5

¿Cómo debe diseñarse una base de datos relacional para manejar atributos multivaluables?atributos multivalor en las bases de datos

edición: Elaborar:

Hay dos maneras en que podría imaginar para hacer esto -

  1. intentar algo como poner valores separados por comas en el campo, que parece un poco torpe.
  2. Cree otra tabla para el campo y deje que los valores múltiples vayan al campo. Esto podría generar una gran cantidad de tablas, si tengo demasiados campos de este tipo.

La pregunta es:

  1. ¿Hay más maneras de manejar esto?
  2. ¿Cuál de los dos métodos anteriores se usa generalmente?

Gracias de antemano

+0

Tienes que ser mucho más explícito que esto. Supongo que el inglés puede no ser tu primer idioma, pero dale una oportunidad. La gente intentará ayudar y algunos arreglarán tu pregunta, pero tienes que darnos algo para seguir. –

Respuesta

1

es la relación de uno a muchos o muchos-a-muchos? Con la relación de uno a varios, recomiendo una clave externa en la tabla secundaria (los muchos) que hace referencia a la tabla padre (la). Con una relación de muchos a muchos, la mejor opción será una tabla separada con claves externas para padres e hijos.

12

En el diseño de base de datos relacional convencional, cada fila & columna debe almacenar solo un valor.

No almacene listas separadas por comas ni nada raro como ese.

Por ejemplo, supongamos que un equipo deportivo tiene siete miembros. Usted puede hacer esto:

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

Pero es mejor hacer esto:

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() es una función de MySQL. Soluciones similares están disponibles en otras marcas de base de datos.

+0

¿Está LAST_INSERT_ID vinculado a una tabla? o es un número único en la base de datos? –

+0

En MySQL, los valores de autoincremento están vinculados a una tabla, no existe ningún objeto de secuencia como Oracle o PostgreSQL. Pero LAST_INSERT_ID() devuelve el valor más reciente generado por un INSERT, independientemente de la tabla que utilizó, lo que lo hace útil para rellenar tablas secundarias. –

+2

También se debe tener en cuenta que LAST_INSERT_ID() y mysql_insert_id() en la API son por conexión. es decir, el valor proviene de la última inserción en esa conexión, no de toda la base de datos. –

1

Si está limitado a trabajar con una base de datos estrictamente relacional, debe almacenar esos valores como filas en una tabla. Y esa era su pregunta: cómo hacerlo con una base de datos relacional. Sin embargo, hay muchas bases de datos disponibles que proporcionan almacenamiento nativo de múltiples valores en un campo que resulta ser una muy buena combinación para muchos datos del mundo real, fácil de programar y más simple de comprender (sin la explosión de tablas que obtienes con la 3ra forma normal). Para más información, véase http://en.wikipedia.org/wiki/MultiValue http://en.wikipedia.org/wiki/IBM_U2 http://en.wikipedia.org/wiki/InterSystems

Cuestiones relacionadas