2011-01-04 10 views
6

Considere una aplicación de comercio electrónico con varias tiendas. El propietario de cada tienda puede editar el catálogo de artículos de su tienda.La mejor manera de almacenar los nombres de elementos enviados por el usuario (y sus sinónimos)

mi esquema de base de datos actual es la siguiente:

item_names: id | name | description | picture | common(BOOL) 
items: id | item_name_id | picture | price | description | picture 
item_synonyms: id | item_name_id | name | error(BOOL) 

Notas: error indica una ortografía incorrecta (por ejemplo, "Ericson".). description y picture de la mesa item_names son "globales" que opcionalmente se pueden sustituir por "locales"description y picture campos de la tabla items (en caso de que el dueño de la tienda quiere suministrar una imagen diferente de un artículo). common ayuda nombres de los elementos únicos separados ("Jimmy Joe Pizza de queso" de "pizza de queso")

Creo que el lado positivo de este esquema es:

Optimizado buscar & Manejo Sinónimos: puedo consultar la item_names & item_synonyms tablas usando name LIKE %QUERY% y obtenga la lista de item_name_id s que deben unirse a la tabla items. (Ejemplos de sinónimos: "Sony Ericsson", "Sony Ericson", "X10", "x 10")

AutoCompletion: vez más, una simple consulta a la tabla item_names. Puedo evitar el uso de DISTINCT y que reduce al mínimo número de variaciones ("Sony Ericsson Xperia ™ X10", "Sony Ericsson - Xperia X10", "Xperia X10, Sony Ericsson")

El lado negativo sería:

Overhead: Cuando insertando un artículo, consulto item_names para ver si este nombre ya existe. Si no, creo una nueva entrada. Cuando eliminando un artículo, cuento el número de entradas con el mismo nombre. Si este es el único elemento con ese nombre, elimino la entrada de la tabla item_names (solo para mantener las cosas limpias, cuentas para posibles envíos erróneos). Y actualizando es la combinación de ambos.

Nombres de elementos extraños: Los propietarios de tiendas a veces usan oraciones como "Harry Potter 1, 2 libros + CDs + sombrero mágico". Hay algo de malo en tener tanta sobrecarga para dar cabida a casos como este. Esto sería quizás la principal razón Estoy tentado a ir a un esquema como éste:

items: id | name | picture | price | description | picture 

(... con item_names y item_synonyms como tablas de utilidad que podía consulta)

  • ¿Hay un mejor esquema que sugirieras?
  • ¿Deben normalizarse los nombres de los elementos para la autocompletar? ¿Es esto probablemente lo que Facebook hace para las entradas "Escuela", "Ciudad"?
  • ¿Es el primer esquema o el segundo mejor/óptimo para la búsqueda?

¡Gracias de antemano!

Referencias: (1) Is normalizing a person's name going too far?, (2) Avoiding DISTINCT


EDIT: En el caso de 2 artículos que se está introduciendo con nombres similares, un administrador que ve esto simplemente hace clic en "Hacer Sinónimo", que convertirá uno de los nombres en el sinónimo del otro. No necesito una forma de detectar automáticamente si un nombre ingresado es el sinónimo del otro. Espero que el autocompletado cumpla con el 95% de esos casos. A medida que el conjunto de tablas aumenta de tamaño, la necesidad de "Hacer sinónimo" disminuirá. Espero que aclare la confusión.


ACTUALIZACIÓN: A los que les gustaría saber lo que siguió adelante con ... He ido con el segundo esquema, pero retira el item_names y item_synonyms tablas con la esperanza de que Solr me proporcionará con la capacidad de realizar todas las tareas restantes que necesito:

items: id | name | picture | price | description | picture 

¡Gracias a todos por la ayuda!

+0

comenzado una recompensa. Esperando obtener más respuestas de todos los gurús de Ye DB. – RabidFire

+1

Creo que el problema es que no tenemos claros sus REQUISITOS. Voy a sugerir lo que creo que está sucediendo. Eres equivalente a Amazon. Más de un vendedor podría ofrecer {Nike Air Jordan Red/White 10.5US}. Pero todos pueden llamarlos por diferentes nombres para que tengas un problema de normalización. Estos no son artículos SKU que tienen un PK universal. ¿Entonces intentas deducir que dos cosas son realmente lo mismo al comparar personajes en el nombre? ¿Y crees que esto es un problema del esquema correcto? No lo entiendo –

+0

Mis requisitos serían "Búsqueda optimizada", "Manejo de sinónimos" y "Autocompletar". Un usuario intenta ingresar un elemento desde un campo de texto. Autocompletar intenta evitar demasiadas variaciones del mismo nombre de elemento. Sí, es un problema de diseño. Estoy buscando una mejor perspectiva para elegir el segundo esquema sobre el primero. – RabidFire

Respuesta

2

Los requisitos que usted declara en su comentario ("Búsqueda optimizada", "Manejo de sinónimos" y "Autocompletar") no son elementos generalmente asociados con un RDBMS. Parece que lo que estás tratando de resolver es un problema de búsqueda, no un problema de almacenamiento y normalización de datos.Es posible que desee empezar a buscar en algunas arquitecturas de búsqueda como Solr

Extraído de la lista de características Solr:

facetadas la búsqueda basada en valores singulares de campo, consultas explícitas, o de intervalos de fecha

sugerencias de ortografía para usuario consulta

Más de esto sugerencias de documento dado

sugerencia automática funcionalidad

optimizaciones de rendimiento

+0

¡Agradable! Eché un vistazo a Solr y sus características. Parece extremadamente poderoso (especialmente su Análisis de texto) y describe exactamente lo que estoy buscando. Gracias. Recompensa otorgada – RabidFire

0

Solo una idea.

Una cosa que me viene a la mente es ordenar los caracteres en el nombre y el sinónimo tirando todo el espacio en blanco. Esto es similar a la solución de encontrar todos los anagramas de una palabra. El resultado final es la capacidad de encontrar rápidamente entradas similares. Como señaló, todos los sinónimos deben converger en un solo término o nombre. La búsqueda se realiza contra sinónimos utilizando nuevamente la cadena de entrada ordenada.

+0

Esa es una buena forma de almacenar anagramas, donde las palabras son * entre sí si los caracteres ordenados con espacios en blanco eliminados son los mismos. Pero no creo que quiera devolver "tapas" cuando un usuario busca "ollas". :) – RabidFire

1

Si hubiera más atributos expuestos para el mapeo, sugeriría usar un sistema de índice de búsqueda rápido. No es necesario establecer alias a medida que se agregan los registros, los atributos simplemente se indexan y cada búsqueda emitida devuelve coincidencias con un puntaje de relevancia. Tome el X% superior como coincidencias válidas y visualícelas.

Crear y almacenar alias parece un enfoque de fuerza bruta, mano de obra intensiva que probablemente no podrá ajustarse a las necesidades de los usuarios.

+0

Supongo que me está pidiendo que elimine el almacenamiento de sinónimos (alias)? ¿Cómo puedo devolver los resultados de búsqueda de "yogurt", "yogurt" o "yogurt"? http://en.wikipedia.org/wiki/Yoghurt Supongo que requerirá mucha mano de obra al principio. Pero a medida que crece la cantidad de elementos, las personas estarán agregando elementos previamente existentes gracias a Autocompletar. Creo que el autocompletado de Facebook para College Name es un buen ejemplo de esto. – RabidFire

+0

Existen sistemas de indexación que usan lógica difusa para buscar coincidencias. Suena similar o similar a los tipos de búsqueda, por ejemplo. No tengo mucha respuesta, estoy de acuerdo, ya que no ofrece una tecnología específica, solo esperaba guiarte en una dirección diferente y darte más opciones. – ScottCher

+0

Gracias por la ayuda. Upvoted ya que me hizo pensar un poco más sobre el segundo esquema. Creo que dejaré todo el trabajo pesado en Solr (basado en la respuesta de otro afiche). – RabidFire

Cuestiones relacionadas