database database-design tags tagging

database - ¿Cuál es la forma más eficiente de almacenar etiquetas en una base de datos?



database-design tags (8)

De hecho, creo que des-normalizar la tabla de etiquetas podría ser una mejor forma de avanzar, dependiendo de la escala.

De esta manera, la tabla de etiquetas simplemente tiene tagid, itemid, tagname.

Obtendrá nombres de etiquetas duplicados, pero hace que agregar / eliminar / editar etiquetas para elementos específicos MUCHO más simple. No tiene que crear una nueva etiqueta, eliminar la asignación de la anterior y reasignar una nueva, simplemente edite el nombre de la etiqueta.

Para mostrar una lista de etiquetas, simplemente use DISTINCT o GROUP BY y, por supuesto, puede contar cuántas veces se usa fácilmente una etiqueta.

Estoy implementando un sistema de etiquetado en mi sitio web similar a uno que utiliza stackoverflow, mi pregunta es: ¿cuál es la forma más efectiva de almacenar etiquetas para que puedan ser buscadas y filtradas?

Mi idea es esta:

Table: Items Columns: Item_ID, Title, Content Table: Tags Columns: Title, Item_ID

¿Es esto demasiado lento? ¿Hay una mejor manera?


Deberías leer las publicaciones de blog de Philipp Keller sobre el etiquetado de esquemas de bases de datos. Prueba algunos e informa sus resultados, tanto en términos de facilidad de construcción de consultas comunes , y en términos de rendimiento . El número de etiquetas, el número de elementos etiquetados y el número de etiquetas por artículo fueron factores. Los mensajes son de 2005; No estoy al tanto de ninguna actualización desde entonces.


Los elementos deben tener un campo "ID" y las etiquetas deben tener un campo "ID" (clave principal, agrupada).

Luego haga una tabla intermedia de ItemID / TagID y coloque el " Índice perfecto " allí.


Realmente no se puede hablar de lentitud en función de los datos que proporcionó en una pregunta. Y no creo que deba preocuparse demasiado por el rendimiento en esta etapa de desarrollo. Se llama optimización prematura .

Sin embargo, le sugiero que incluya la columna Tag_ID en la tabla de etiquetas. Por lo general, es una buena práctica que cada tabla tenga una columna de ID.


Si el espacio va a ser un problema, tenga una tercera tabla Etiquetas (Tag_Id, Título) para almacenar el texto de la etiqueta y luego cambie su tabla de Etiquetas para que sea (Tag_Id, Item_Id). Esos dos valores también deberían proporcionar una clave primaria compuesta única.


Si no le importa usar un poco de material no estándar, la versión 9.4 y posteriores de Postgres tiene la opción de almacenar un registro de matriz de texto tipo JSON.

Su esquema sería:

Table: Items Columns: Item_ID:int, Title:text, Content:text Table: Tags Columns: Item_ID:int, Tag_Title:text[]

Para obtener más información, consulte esta excelente publicación de Josh Berkus: http://www.databasesoup.com/2015/01/tag-all-things.html

Hay más opciones diferentes comparadas a fondo para el rendimiento y la sugerida anteriormente es la mejor en general.


Sugeriría utilizar una tercera tabla intermedia para almacenar asociaciones de elementos de etiquetas <=>, ya que tenemos relaciones de muchos a muchos entre etiquetas y elementos, es decir, un elemento puede asociarse con varias etiquetas y una etiqueta puede asociarse con varios elementos. HTH, Valve.


Un elemento va a tener muchas etiquetas. Y una etiqueta pertenecerá a muchos artículos. Esto implica para mí que muy posiblemente necesitará una tabla intermedia para superar el obstáculo de muchos a muchos.

Algo como:

Tabla: Artículos
Columnas: Item_ID, Item_Title, contenido

Tabla: Etiquetas
Columnas: Tag_ID, Tag_Title

Tabla: Items_Tags
Columnas: Item_ID, Tag_ID

Puede ser que su aplicación web sea increíblemente popular y necesite la desnormalización en el futuro, pero no tiene sentido ensuciar las aguas demasiado pronto.