Pregunta

Estoy al día planeando crear una gran base de datos (más de 2 millones de filas) con una variedad de datos de fuentes separadas. Me gustaría evitar estructurar la base de datos alrededor de identificadores de aumento automático para ayudar a evitar problemas de sincronización con la replicación, y también porque cada elemento insertado tendrá un código de producto alfanumérico que se garantiza que es único; me parece más sensato usar eso en su lugar.

Estoy mirando un motor de búsqueda para indexar esta base de datos con Sphinx que parece bastante atractiva debido a su diseño en torno a la indexación de bases de datos relacionales. Sin embargo, mirar varios tutoriales y documentación parece mostrar que los diseños de bases de datos dependen de un campo de aumento automático de una forma u otra y más bien declaración en negrita en la documentación que dice que los identificadores de documentos deben ser enteros de 32/64 bits solamente o las cosas se rompen.

¿Hay alguna forma de tener una base de datos indexada por Sphinx sin campos de auto_increment como id?

¿Fue útil?

Solución

sphinx solo requiere que los identificadores sean enteros y únicos, no le importa si se incrementan automáticamente o no, por lo que puede implementar su propia lógica. Por ejemplo, genere hashes enteros para sus claves de cadena.

Otros consejos

Claro, es fácil evitarlo. Si necesita crear sus propios ID solo para Sphinx y no desea que colisionen, puede hacer algo como esto en su sphinx.conf (código de ejemplo para MySQL)

source products {

  # Use a variable to store a throwaway ID value
  sql_query_pre = SELECT @id := 0 

  # Keep incrementing the throwaway ID.
  # "code" is present twice because Sphinx does not full-text index attributes
  sql_query = SELECT @id := @id + 1, code AS code_attr, code, description FROM products

  # Return the code so that your app will know which records were matched
  # this will only work in Sphinx 0.9.10 and higher!
  sql_attr_string = code_attr  
}

El único problema es que aún necesita una forma de saber qué registros coincidieron con su búsqueda. Sphinx devolverá la identificación (que ahora no tiene sentido) más las columnas que marque como " atributos " ;.

Sphinx 0.9.10 y superior podrán devolverte el código de tu producto como parte de los resultados de búsqueda porque tiene soporte para atributos de cadena.

0.9.10 todavía no es un lanzamiento oficial, pero se ve muy bien. Parece que Zawodny lo está ejecutando en la lista de Craig , así que no estaría demasiado nervioso por confiar en esta característica.

Sphinx no depende del incremento automático, solo necesita identificadores de documentos enteros únicos. Tal vez pueda tener una identificación entera única sustituta en las tablas para trabajar con sphinx. Como se sabe, las búsquedas de enteros son mucho más rápidas que las alfanuméricas. Por cierto, ¿cuánto dura su código de producto alfanumérico? alguna muestra?

Creo que es posible generar un flujo XML a partir de sus datos. Luego cree la identificación a través del software (Ruby, Java, PHP).

Echa un vistazo a http://github.com/burke/mongosphinx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top