Pregunta

Tengo una aplicación web ejecutándose sobre una base de datos MySQL (en desarrollo).Estoy considerando migrar mi aplicación a Google App Engine y me gustaría comprender mejor cómo mi modelo de base de datos relacional simple se puede transformar al enfoque no relacional.

Soy una persona que utiliza bases de datos relacionales desde hace mucho tiempo y no tengo experiencia con bases de datos basadas en columnas como BigTable.En caso de que Google también admita pequeñas implementaciones de bases de datos relacionales, me gustaría afirmar que mi pregunta es general y no específica de Google: me gustaría entender cómo se pueden representar modelos relacionales simples en bases de datos no relacionales.

Mi base de datos (simplificada) es la siguiente:

Items Table
------------

ItemID  ItemName  ItemPriority
1       "Car"     7
2       "Table"   2
3       "Desk"    7

ItemProperties Table
---------------------

ItemID  Property        Importance 
1       "Blue"          1
1       "Four Wheels"   2
1       "Sedan"         0
2       "Rectangular"   1
2       "One Leg"       1

Tengo muchos artículos, cada uno con un nombre y una identificación.Cada elemento tiene múltiples propiedades, cada propiedad tiene varios parámetros (solo mencioné el nombre y la "importancia" de cada propiedad, pero hay más).Tengo decenas de millones de artículos, cada uno con cientos de propiedades.

El escenario de uso:Recibo un ItemName como entrada, busco su ID en la tabla de elementos y busco todas las propiedades por esa identificación.Luego realizo algunos análisis en la lista de propiedades (en la memoria) y devuelvo un resultado.

El 90% del trabajo es una búsqueda basada en un parámetro, que (si entiendo correctamente) es el problema de las bases de datos no relacionales.

¿Cuál es el enfoque recomendado?

¿Fue útil?

Solución

A partir de alguien que ha estado trabajando con Non-relacionales db por un tiempo sus dos tablas deben ser muy fácil de traducir a una base de datos no relacionales.

Tome las dos tablas y convertirlos en un solo objeto.

artículo:  - Carné de identidad  - Nombre  - Propiedades     - prop1     - prop 2

Guarde todo el asunto en sus columnas de almacenamiento de datos (Big-Tabla), documento (CouchDB), o cualquier otra cosa que utiliza.

Puede consultar elementos por cualquiera de los ID, nombres o propiedades. No hay uniones que uno de los grandes puntos de dolor de DBS no relacionales. operaciones de búsqueda de los parámetros no son realmente un punto de dolor, a menos que no estoy entendiendo lo que quiere decir con eso. Es posible que tenga que hacer múltiples búsquedas, pero la mayoría de veces que no es un problema y que las escalas mucho mejor que hace un RDBMS.

En el ejemplo que realmente considero el modelo no relacional a ser más simple y más fácil de implementar y entender.

Cada almacén de datos no relacionales tiene diferentes convenciones y limitaciones aunque por lo que a darle duro orientación en el sentido general. CouchDB puede crear un índice en cualquier parte del objeto con sus vistas, por ejemplo. Con BigTable puede que tenga que almacenar múltiples copias de los datos no normalizados para obtener búsquedas indexadas rápido. Otros tendrán diferentes cosas a considerar cuando se decide cómo almacenar los datos. Hay un buen montón de diferenciación por ahí una vez que deje el mundo de SQL.

Otros consejos

GQL no soporta une. Puede solucionar esto de dos maneras:

  • el júntate

Sólo buscar el artículo, compruebe su ItemID y consulta para ItemProperties con que ItemID. Sus tablas se verá exactamente igual que ellos especificado. Claro, esto es dos consultas, pero las dos consultas son simples.

  • Modelos Uso Expando

En un modelo Expando, puede crear nuevos campos en tiempo de ejecución. No van a ser indexados, por lo que si desea buscar en ellos puede ser más lenta, sino que simplemente ir a buscar ellos es muy bien. Puede utilizar los tipos complejos como ListProperty, también. Con este tipo de flexibilidad, que puede ser capaz de pensar en una manera de poner todo en la mesa ItemProperties en la tabla de artículos, y se ahorrará una consulta. Sea creativo.

Tengo una estructura de base de datos muy similar (nuestras tablas "registros" y "recordEntries" reflejan sus "elementos" y "itemProperties") y estoy considerando una migración similar a una base de datos no relacional.Probablemente iremos a CouchDB o memcachedb o algo así, en lugar de a Google.

Al igual que usted, no tengo experiencia trabajando con bases de datos no relacionales (ni tampoco mis desarrolladores).Sin embargo, hemos descartado un par de ideas.Nuestros pensamientos actuales son (usando su esquema):

  • Primero:Contraiga cada elemento más sus propiedades en un objeto con campos (esencialmente un documento XML) y colóquelo en la base de datos codificada por identificador.Cada vez que recupera un elemento, también recupera todas las propiedades del elemento.

Tenga en cuenta que la diferencia que tenemos es que indexamos nuestro contenido fuera de la base de datos (con Solr) y, por lo tanto, no necesitamos realizar búsquedas en la base de datos usando la propiedad "nombre", por lo que YMMV.

  • Segundo:Estamos haciendo una lista de todas las operaciones "relacionales" que estamos realizando y que el modelo anterior no admite.Esto incluye un par de operaciones de "agrupación" en las que consultamos elementos en función de un campo especial en la tabla de elementos, y una consulta en la que intentamos detectar todos los elementos que se han modificado recientemente (lo que antes se lograba mediante una consulta en una columna de fecha en la tabla de artículos).Estamos inventando implementaciones alternativas para cada uno de estos casos (afortunadamente, solo hay unas pocas).

Si esto resulta demasiado difícil, intentaremos el mismo ejercicio con otro modelo.Por suerte, tenemos tiempo para planificar.

Un punto clave para nosotros es que estamos haciendo toda nuestra indexación externamente con Solr, por lo que (por ejemplo) no necesitamos realizar búsquedas en la base de datos de los valores de itemProperties, ni realizar búsquedas por nombre en la tabla de elementos.

De todos modos, probablemente eso no sea de mucha ayuda, pero estaré interesado en ver qué tipo de soluciones pueden encontrar las personas más experimentadas.

PD:Infiero que su tabla de propiedades debe tener miles de millones de filas.¿Cuántos exactamente y en qué hardware está ejecutando el servidor MySQL?¿Ya tienes problemas de escalabilidad con MySQL?

Es necesario para aplanar todo, creo AppEngine permite estructuras como

ID = 1, ItemName = coches, ItemPriority = 7, Propiedad = (azul, 1), Propiedad = (cuatro ruedas, 2), Propiedad = (Sedan, 0) ID = 2, ItemName = Mesa, ItemPriority = 2, Propiedad = (Rectangular, 1), Propiedad = (una pierna, 1) ID = 3, ItemName = turística, ItemPriority = 7

Tenga en cuenta que el mismo "campo" puede tener varios valores, y que podría utilizar varios artículos en ella.

Sus datos de ejemplo serían 3 filas en una tabla.

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