2009-09-26 13 views
7

Me gustaría aclarar un poco más sobre el método toxi de almacenar etiquetas en una base de datos, mencionado en otro lugar en SO.Almacenamiento de etiquetas en la base de datos. ¿Guardar etiqueta una o más veces?

El esquema de base de datos es:

Table: Item 
Columns: ItemID, Title, Content 

Table: Tag 
Columns: TagID, Title 

Table: ItemTag 
Columns: ItemID, TagID 

Esta es probablemente una pregunta estúpida (pero no sé la respuesta) ... En caso de cada entrada, en la etiqueta de la tabla, tener un título único. es decir, ¿solo almaceno una etiqueta una vez o la almaceno cada vez que la uso?

Para ilustrar, ¿cuál de las dos tablas a continuación debería terminar con:

TagID  Title 
1   Fish 
2   Cat 
3   Dog 

o

TagID  Title 
1   Fish 
2   Fish 
3   Cat 
4   Fish 
5   Dog 
6   Cat 

Si se utiliza la primera tabla, antes de entrar en la etiqueta que primero tendría que funcionar y instrucción SQL para averiguar si existe, ¿correcto?

Cualquier ayuda será apreciada. Me quemé los dedos recientemente debido a la piratería e indexación, quiero comenzar a corregir los conceptos básicos.

+0

En su segunda solución, realmente no necesita una tabla de etiquetas, solo guarde la etiqueta en su tabla ItemTag en lugar de TagID. Aunque usaría la primera solución. – Vertigo

Respuesta

4

Lo básico es que necesita almacenar etiquetas como las que muestra en el primer caso. Es bueno para verificar si existe una etiqueta (dado que en el segundo caso para las etiquetas existentes su db devolverá tantas filas como esas apariencias de etiqueta) y para recuperar elementos por etiqueta (seleccionar ID de elemento por una ID de etiqueta es mejor que seleccionar elemento ids por un conjunto de tag_id que tiene el mismo significado de representación).

Si se ha quemado los dedos debido a la indexación, siempre debe comprobar cómo se está ejecutando la consulta (para mysql es EXPLAIN/DESCRIBE SELECT).

2

Si "Fish" y "Fish" son la misma etiqueta, probablemente debería tenerla solo una vez en su tabla Tag.

Por lo tanto, me gustaría ir con su primera solución, que, de hecho, implica hacer un select antes de su insert, para determinar si la etiqueta ya existe o no; y, si existe, usando su TagID ya existente para el enlace entre el elemento y la etiqueta, en la tabla ItemTag.

En realidad, esta es la razón por la cual existe ItemTag: es una tabla de asociación, que almacena las correspondencias entre los artículos y la etiqueta: para cada artículo, puede tener varias etiquetas y, para cada etiqueta, puede tener varias artículos.

Esto también, por cierto, facilitará las cosas para obtener una lista de elementos que están adjuntos a una etiqueta específica.

1

Debe tener las etiquetas solo una vez en la tabla de etiquetas; el objetivo de la tabla ItemTag es proporcionarle una asociación n: m (cada elemento tiene varias etiquetas y cada etiqueta pertenece a varios elementos).

Si repite los títulos de las etiquetas, puede simplificar la estructura haciendo que la tabla de etiquetas use ID de elemento de inmediato, no ID de etiqueta.

+0

-1: las etiquetas repetitivas y el uso de la tabla de etiquetas con elemento_idificaría la búsqueda de recursos realmente caros, ya que la búsqueda sería comparando cadenas en lugar de enteros, que es mucho más lento. – Eimantas

+0

@Eimantas: No recomiendo repetir etiquetas. Solo quiero que las etiquetas * if * se repitan, puedes soltar una tabla. –

Cuestiones relacionadas