2010-04-13 27 views
5

He estado leyendo sobre claves externas y me he unido recientemente, y me ha sorprendido gratamente que muchos de los conceptos básicos sean cosas que ya estoy poniendo en práctica. Por ejemplo, con un proyecto que estoy trabajando actualmente, estoy organizando listas de palabras, y tienen una mesa para los juegos, así:Relaciones Muchos a Muchos en MySQL

`words` Table 
    `word_id` 
    `headword` 
    `category_id` 
`categories` Table 
    `category_id` 
    `category_name` 

Ahora, generalmente hablando, esto sería un uno-a muchas relaciones, con varias palabras ubicadas en una sola categoría con la clave externa category_id. Sin embargo, supongamos por un momento que un usuario elige agregar otra categoría a una palabra, por lo que es de muchos a muchos. ¿Hay alguna manera de configurar mi tabla words para manejar categorías adicionales para las palabras sin crear columnas adicionales como category_2 , category_3, etc.?

Respuesta

12

Por lo general, tiene una tabla separada para manejar estas asignaciones:

`Words_Categories` Table 
    `word_id` 
    `category_id` 

Cada par en esta tabla Words_Categories representa una posible asignación de palabra a cualquier otra categoría.

El campo category_id en la tabla Words no es necesario en este esquema, ya que ninguna de estas tablas se hace referencia directamente.

+0

¿es siempre con ambos plurales para una tabla de unión de muchos a muchos? Al menos, ¿es esa la convención? – Thufir

4

Eliminaría el category_id de la tabla de palabras y tiene una tabla word_category que contiene word_id, category_id (generalmente índice único o restricción) que normalmente se llama una tabla de enlace o tabla puente. Esta es la estructura normalizada típica para una relación de muchos a muchos.

Tener múltiples columnas category_id en la tabla de palabras no es aconsejable por muchas razones, por lo que las formas normales eliminan que las "matrices" se almacenen en filas.

+0

"normalmente se llama una tabla de enlace o tabla de puente" gracias por agregar la terminología aquí. –

6

NO DEBE crear columnas adicionales como category_2 y category_3. De esa manera yace la locura.

En su lugar, eliminaría la columna "category_id" de la tabla "words". Luego, crearía una nueva tabla "category_words" con columnas "category_id" y "word_id". Para colocar una palabra en una categoría, inserte un registro en esta tabla. Para colocar la misma palabra en otra categoría, inserte otro registro en la tabla.

+4

+1 por "¡De esa manera yace la locura!" ;) – FrustratedWithFormsDesigner

Cuestiones relacionadas