2010-08-22 27 views
7

Tengo una base de datos que contiene dos tablas:¿La mejor manera de almacenar etiquetas en una base de datos?

  • entradas
  • etiquetas

La tabla contiene las entradas de mensajes que cada uno tiene una o más etiquetas. El problema es que cada publicación puede tener cualquier cantidad de etiquetas. En otras palabras, no puedo tener una columna 'tag1', 'tag2', etc. y hacer una unión IZQUIERDA.

¿Cómo debo configurar las entradas para que cada publicación pueda tener cualquier cantidad de etiquetas?

Respuesta

11

Necesita una tabla de asignación.

Cree una tabla llamada entries_tags que contiene dos columnas: entry_id y tag_id, con varias teclas en ambas entradas.

Esto se llama relación muchos a muchos.

+0

Sí, y asegúrese de que ninguna entrada tenga una etiqueta duplicada. Actualizar la etiqueta será un poco complicado, ya que necesita asegurarse de que los existentes permanezcan, los nuevos agregados, los eliminados se eliminen. Por supuesto, siempre puedes eliminar todo y luego agregarlos de nuevo para ahorrarte la molestia de comparar. Pros y contras, diría yo. –

+1

@ o.k.w: puede manejar todos estos problemas mediante restricciones de clave externa y actualizaciones transaccionales. – Borealid

+0

@ o.k.w: Además, una clave principal (preferible) o una restricción única en ambas columnas garantizaría la exclusividad por combinación. –

3

También puede hacerlo el SO-camino, donde además de tener una tabla de unión/mapeo/intersección, usted tiene una lista de etiquetas de la entrada que es taggable:

entries table: 
post_id: 3539744, .... tags: sql, database, database-design, tags, data-modeling 

Si no puede tomar el golpe de rendimiento de usar una tabla de unión al tirar de las etiquetas asociadas para una entrada. Por supuesto, se debe tener especial cuidado aquí porque se trata de datos desnormalizados.

Cuestiones relacionadas