2010-12-21 37 views
9

Quiero crear un sistema de etiquetas simple usando php y mysql, para que los usuarios puedan agregar algunas etiquetas a través del formulario. Mi pregunta es, ¿debería guardar las etiquetas como una matriz en una sola columna de base de datos? p.ej. "tag1, tag2, tag3" ... o debería tener columnas separadas en la tabla de la base de datos donde debería guardar cada etiqueta en cada columna. Espero que mi pregunta sea clara. Gracias.cómo guardar etiquetas (palabras clave) en la base de datos?

Respuesta

20

Probablemente diría que ninguno de los dos. Use una relación de varios a varios entre las etiquetas y el objeto que se va a etiquetar. Por ejemplo, si lo que se etiqueta es una pregunta, las tablas puede verse como esto:

Question: 
    QuestionId 
    Title 
    Body 

Tag: 
    TagId 
    Name 

QuestionTags: 
    QuestionId 
    TagId 
+3

De esta manera proporciona escalabilidad y permite la optimización de la base de datos con índices. Buena respuesta. –

+0

Aterricé en esta página buscando recomendaciones para actualizar una lista de etiquetas en dicho esquema. ¿Como lo harias? ELIMINAR FROM QuestionTags WHERE QuestionId = 123 y luego INSERTing INTO QuestionTags todas las etiquetas restantes y nuevas? Parece ser el más fácil para el desarrollador, pero podría no ser el mejor para el rendimiento ... – Henno

+0

@Henno No estoy seguro de entender lo que quieres decir. ¿Puedes hacer una pregunta por separado? –

0

usted podría utilizar serializar y unserialise para almacenar las palabras clave en un campo. Más información aquí http://php.net/manual/en/function.serialize.php

Algo como esto ...

$keywords = array('apple', 'pear', 'banana', 'peach'); 
$keywords_serialized = serialize($keywords); 
$sql = INSERT INTO dbtable (keywords) VALUES ($keywords_serialized); 
+2

Cómo matar el rendimiento ... –

+2

Debería ser algo muy raro que una cadena serializada se almacene en una base de datos. –

+4

gracias, aprendí algo hoy – user466764

8

encontré con ese tema hoy en día también se reunieron y algunas ideas aquí, y aunque la pregunta no es muy nuevo, voy a dejar mi solución también:

Creo que la respuesta que dio Klaus Byskov Hoffmann no fue mala, pero agregaría eso y almacenaría la lista de referencias como tabla de muchos a muchos como él dijo, pero también como cadena serializada de alguna forma (ya sea a través de serializar como dijo user466764, o simplemente como una coma separada, como dijiste a ti mismo, que podría manejarse con i mplode/explode) en la tabla principal.

sí, lo sé: el almacenamiento de los mismos datos dos veces no es muy bien recibida con muchos perfeccionistas de bases de datos, ya que lleva el peligro de recibir inconsistencias, pero lo haría de esa manera para el rendimiento y simplicidad:

la tabla de muchos a muchos (tabla de etiquetas) es solo para búsqueda. para aumentar el rendimiento de la búsqueda, limitaría el acceso a esa tabla ÚNICAMENTE para buscar (y, por supuesto, debemos actualizarlo cuando se editen las etiquetas), pero nunca lo consulte solo para ver/enumerar las etiquetas en algún lugar. y la lista de etiquetas serializada es para cada lugar donde está viendo el artículo o artículo en cuestión: cuando visualiza ese artículo, ya tiene la tabla, realizando otra consulta a la tabla de etiquetas cada vez que desea mostrar esa página. innecesario cuando ya tienes la lista en la tabla principal. asegúrese de tener cuidado al actualizar las etiquetas para actualizarlas siempre en ambos lugares, preferiblemente a través de una única función de configuración que hace ambas cosas, y no debería tener problemas de inconsistencia.

+0

Totalmente de acuerdo. La optimización del tiempo de carga de la página debería ser tan importante como la normalización de la base de datos. – KalC

Cuestiones relacionadas