2010-09-21 21 views
6

No he tocado ningún código en unos buenos 4-5 meses, así que volver a hacerlo hoy, generalmente me toma una semana más o menos para que toda la información fluya a través de mi cerebro una vez que me tome meses libres de esa manera. Así que mi proyecto que estoy a punto de comenzar será una base de datos de marcadores backend de PHP/MySQL.¿La mejor manera de almacenar y buscar palabras clave para un registro en PHP y MySQL?

Quiero crear una buena base de datos de búsqueda con todos mis favoritos sitios web/marcadores. Cada registro tendrá varias palabras clave asignadas para que pueda buscar fácilmente todos mis marcadores para el término "php" y todos los registros con "php" en su columna o título de palabra clave o de lo contrario volverá en un conjunto de resultados.

Aquí es mi idea de la base de datos hasta el momento ...

auto_id = /*Auto incremented ID number for database*/ 
name/title = /*Name/title of the Website*/ 
description = /*brief description of the site*/ 
URL = /*URL to open when I click a link*/ 
clicks = /*increments by 1 everytime I click the link*/ 
date_created = /*datetime that URL bookmark was added*/ 
date_accessed = /*datetime field for when last clicked on*/ 
category = /*category name or number to create a folder like structure of bookmarks in groups*/ 
sub_category = /*some categories will have subcategories (ie programming->c## programming->PHP)*/ 
keywords = /*Keywords used for searching*/ 

Esto es bastante sencillo para mí sobre cómo construir este sistema todos excepto Busco ayuda/consejos sobre la mejor manera de almacenar las palabras clave. Cada sitio web/registro que agrego al DB puede tener 1 hasta varias palabras clave por sitio. Estas palabras clave deben poder ayudar con la parte de búsqueda de mi aplicación. Entonces, ¿cómo debo almacenar palabras clave para un sitio en mi base de datos? Sé que podría tener una fila de "palabras clave" en la tabla y almacenar las palabras clave para cada registro como "php, web, etc., keyword4", de modo que todas las palabras clave de cada sitio se guarden en 1 columna, pero esto no parece ser el mejor método cuando se trata de buscar en la base de datos.

Por favor dígame cómo haría esta parte? Gracias por cualquier ayuda

+0

posible duplicado del [sistema de seguimiento de los favoritos de los usuarios] (http://stackoverflow.com/questions/3722242/system-for-keeping-track-of-user-favorites) –

+1

@Daniel Vandersluis: No diría que sí, tal vez para ambas preguntas la estructura de la base de datos de la solución es similar/idéntica, pero esta pregunta está pidiendo resolver un c problema Quiero decir que estaba buscando excatly para esto en Google y no "cómo hacer un seguimiento de favoritos" –

Respuesta

7

La mejor manera de hacer esto es crear una tabla separada para contener las palabras clave y luego añadir una intersección (o se unen ) tabla de palabras clave para unirse con los marcadores.

CREATE TABLE bookmarks (
    id INT NOT NULL, 
    ... etc. 
) 

CREATE TABLE keywords (
    id INT NOT NULL, 
    ... etc. 
) 

CREATE TABLE bookmark_keywords (
    bookmark_id INT NOT NULL, 
    keyword_id INT NOT NULL, 
    PRIMARY KEY (bookmark_id, keyword_id), 
    FOREIGN KEY bookmark_id REFERENCES bookmarks (id), 
    FOREIGN KEY keyword_id REFERENCES keywords (id) 
) 

Al insertar un marcador, también tendría insertar las palabras clave que están siendo utilizados y que no están ya en la tabla keywords, así como una fila en bookmark_keywords con el fin de unirse a la palabra clave con el marcador .

Entonces, cuando se desea una consulta de palabras clave que un marcador tiene:

SELECT k.* 
FROM keywords AS k 
LEFT JOIN bookmark_keywords AS kb 
    ON kb.keyword_id = k.id 
WHERE kb.bookmark_id = [ID of the bookmark] 

Y para consultar qué marcadores compartir una determinada palabra clave:

SELECT b.* 
FROM bookmarks AS b 
LEFT JOIN bookmark_keywords AS kb 
    ON kb.bookmark_id = b.id 
WHERE kb.keyword_id = [ID of the keyword] 
+0

+1 simple pista clara y clara sobre cómo hacerlo! Gracias Daniel y otra aclamación por SO. –

2

La técnica de búsqueda más fácil y rápida para implementar es el uso de la declaración LIKE de MySQL. LIKE le permite buscar en una columna una cadena específica. Consideremos el siguiente ejemplo ...

auto_id name   description 
1   Cool PHP Site you know you love it 
2   PLARP! its Ruby gems gems gems! 
3   SqlWha   sql for the masses 
4   FuzzD00dle  fun in the sun, with some fuzz 

Usted puede encontrar todos los registros que contengan la cadena 'php', ya sea en el 'nombre' o el campo 'descripción' utilizando la siguiente consulta ...

SELECT * FROM bookmarks WHERE name LIKE '%php%' OR description LIKE '%php%'; 
  • '%' es un carácter comodín.

de Referencia sobre MySQL como: http://www.tutorialspoint.com/mysql/mysql-like-clause.htm

También puede agregar una columna 'palabras clave' y almacenar las palabras clave en un formato delimitado por comas (por ejemplo: plarp1, plarp2, plarp3), a continuación, buscar a través de eso.

+0

+1 interestring too! –

6

Tienes razón, almacenar una lista separada por comas en una columna no es una buena manera de hacerlo (esto se llama un grupo repitiendo y viola la First Normal Form de diseño de base de datos relacional).

El uso de un predicado LIKE es no una buena opción, porque no puede beneficiarse de un índice. La búsqueda de palabras clave de esta manera es cientos o miles de veces más lenta que el diseño de una base de datos adecuada en forma normal y la adición de índices.

Necesita almacenar una segunda tabla con una lista de palabras clave, y una tercera tabla de muchas a muchas para emparejar las palabras clave con los marcadores correspondientes. Este es un diseño bastante estándar para "etiquetar" en una base de datos relacional.

En bases de datos no relacionales como CouchDB o MongoDB, puede hacer que un campo sea un conjunto de palabras clave e indexarlas para que las consultas sean eficientes. Pero no en una base de datos relacional.

Consulte también:

También cuando vean esas preguntas, comprobar las muchas preguntas relacionadas en la columna de la derecha.

Cuestiones relacionadas