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!
comenzado una recompensa. Esperando obtener más respuestas de todos los gurús de Ye DB. – RabidFire
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 –
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