database-design - online - google database design tool
atributos multivalor en las bases de datos (4)
¿La relación es 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.
¿Cómo debe diseñarse una base de datos relacional para manejar atributos de múltiples valores?
editar : Para elaborar:
Hay dos maneras en que podría pensar para hacer esto:
- Intentando poner valores separados por comas en el campo, lo que parece un poco torpe.
- 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:
- ¿Hay alguna forma más de manejar esto?
- ¿Cuál de los dos métodos anteriores se usa generalmente?
Gracias por adelantado
Lea aquí http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html sobre las formas normales de diseño de base de datos First (1NF), Second (2NF) y Third (3NF). Hay más formularios por encima de 3NF, pero generalmente 3NF es suficiente.
Si está limitado a trabajar con una base de datos estrictamente relacional, entonces necesita 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 de muchos datos del mundo real, fáciles de programar y más simples de comprender (sin la explosión de tablas que obtienes con 3ra forma normal). Para obtener más información, consulte http://en.wikipedia.org/wiki/MultiValue http://en.wikipedia.org/wiki/IBM_U2 http://en.wikipedia.org/wiki/InterSystems
En el diseño de base de datos relacional convencional, cada fila y columna debe almacenar solo un valor.
No almacene listas separadas por comas o cualquier cosa loca como esa.
Por ejemplo, digamos que un equipo deportivo tiene siete miembros. Podrías 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.