Necesidad de almacenar LOTES de datos en el dispositivo Android, pensando en ir OODB

Actualmente estoy trabajando en un proyecto basado en Android. Sin entrar en muchos detalles, el software se ejecutará en un dispositivo personalizado. El hardware nunca cambiará y siempre será el mismo. Eso es una ventaja definitiva 🙂

Dicho esto, este proyecto nos está obligando a almacenar cargas y cargas de datos en el dispositivo – hacia arriba de 3m filas en algunas tablas. SQLite se encarga de escanear estas muchas filas muy bien para nosotros, el problema viene cuando empezamos a hacer combinaciones complejas para traer de vuelta todos los datos relacionados que necesitamos. Hemos pensado en desnormalizar la base de datos pero tememos que empujará la base de datos fuera del ámbito de usable.

Estamos buscando en el uso de una base de datos orientada a objetos, algo como db4o o NeoDatis. Nuestra esperanza es que al almacenar objetos podemos deshacernos de nuestras relaciones en un nivel de fila y almacenarlas en el objeto (al igual que OOP). El problema es que no hemos podido encontrar ningún benchmark relacionado con el desempeño (por lo menos no reciente) de estos ODBs que se ejecutan y se utilizan en Android.

¿Alguien tiene alguna experiencia con OODBs en Android y / o con el almacenamiento y el acceso a esta gran cantidad de datos? Si es así cualquier consejo que podría proporcionar sería muy apreciado.

– Editar

Aquí hay un ejemplo del problema que estamos enfrentando. No está relacionado con nuestra aplicación (mi NDA dice que no puedo publicar nada específico), pero este ejemplo representa bien el problema.

Imagine que estamos construyendo una aplicación para monitorear cada vehículo que está manejando en el New Jersey Turnpike en cualquier momento dado. Para cualquier coche dado que necesitamos seguir el coche hace y modelo, cuántas personas están en el coche y cuál es el demográfico de la gente en el coche. Así que básicamente terminan con datos que se parecen a algo –

coche

Id Color | Make_id | In_toll_lane | Model_id

hacer

Id nombre

modelo

Id Nombre | Make_id

Car_person

Id Edad | Sexo | Is_driver | Car_id

Peajes

Id Cars_in_line | Ideal_cars_in_line | Ocupantes ideales

Estos datos van a cambiar con frecuencia. También va a ser bastante grande, ya que no hay duda de un montón de gente conduciendo por la NJ Pike en cualquier momento dado.

Con estos datos tenemos que ser capaces de un tiro rápido, a petición, de cualquier persona que está conduciendo en el lucio. También tenemos que ser capaces de tomar una foto instantánea de todos los machos que están conduciendo, o todas las mujeres en la autopista. También debemos ser capaces de buscar por edad, sexo, marca, modelo, etc.

Ahora imagine que tenemos que averiguar qué carril de peaje cada coche debe ir en función del número de personas en el coche, el número ideal de ocupantes, el número de coches ya en línea, y el número ideal de coches que deben estar en línea .

Este es un ejemplo muy simple, aunque bastante representativo de nuestro problema.

– Finalizar Editar

¡Gracias por adelantado!

Aquí hay algunas observaciones, aunque sospecho que no le ayudará directamente.

Creo que las preguntas principales son: ¿Va a descubrir sus complejas relaciones a través de la lógica de ejecución de aplicaciones como eventos de generar o cambiar datos o vas a tener que simplemente volcado de datos en una tienda y luego descubre anticipar relaciones a través de consulta?

Si la lógica de su negocio llena el modelo, entonces puede crear fácilmente vistas basadas en modelos de sus distintas secciones del modelo de datos, por ejemplo, colecciones que conocen todos los coches que tienen conductores de sexo masculino / femenino. En este caso, básicamente, sus relaciones son semi-estáticas que cambian raramente (mientras que los valores de datos en el otro extremo de esas relaciones están probablemente cambiando mucho). Si este es el caso, entonces ¿por qué tratar y almacenar los datos en una tecnología de base de datos que está obligando a recalcular constantemente las relaciones (JOIN). Es sólo un desperdicio de CPU y es por eso que verá el mal desempeño como el modelo se vuelve complejo. Por lo tanto, una vez que responda a estas preguntas, será muy claro si ODB o RDB es la mejor opción.

Ahora la pregunta se convierte en, lo que se ejecutará en Android y manejar grandes datos? Aquí es donde creo que no puedo ayudar. Trabajo en Versant que tiene (db4o y Versant) ODB. Ahora db4o se ejecutará en Android, pero realmente es la elección correcta para los datos enormes … No. No a menos que tenga datos muy aislados que pueden estar en bases de datos separadas y se accede sólo de forma aislada y no me suena como es su situación. Nuestra otra base de datos, Versant es mean't para manejar enormes datos en tiempo casi real, pero sólo el cliente es 100% Java, el servidor está escrito en C, por lo que no se ejecutará en Android.

Creo que tendrá que hacer algunas investigaciones para ver quién tiene ODB que puede manejar enormes datos en Android.

Mejor, -Robert

Usted no dice mucho acerca de sus necesidades de acceso a los datos o la carga de datos realmente.

Si tienes 3M filas principales, y luego un montón de tablas de hojas más pequeñas, entonces usted puede hacer bien por el almacenamiento en caché de todas las tablas de hojas en RAM, y "unirse" a ellos a mano. Muchos sistemas tienen tablas de hojas muy pequeñas (especialmente en comparación con los datos principales), por lo que cargarlos en RAM y luego simplemente buscarlos cuando se carga la fila puede ser un gran triunfo.

Obviamente, usted no hace esto con las relaciones mayores padre-> hijo, pero si se puede eliminar la hoja se une, entonces una lectura se convierten en una sola unión entre el padre y el hijo en lugar de media docena a las tablas padre, hijo y hoja .

Incluso si esto no funciona para todas las tablas de hoja, si funciona para una gran mayoría, puede ser suficiente para llegar a la joroba.

Hablando para db4o: Ejecutamos todas nuestras pruebas de regresión en Android porque creemos que se convertirá en una plataforma muy importante para db4o.

Db4o funciona muy bien por el orden de magnitud de 3 millones de objetos.

Estamos haciendo pruebas de benchmark contra otras bases de datos en http://www.polepos.org/ y pronto lanzaremos una nueva versión del benchmark donde ejecutaremos una configuración compleja, también contra SqlLite. Portar el punto de referencia a Android también es una consideración.

Si las uniones están matando su funcionamiento y usted tiene datos muy heterogéneos, db4o podría trabajar mejor que una base de datos relacional.

Tu aplicación parece interesante. Si necesitas ayuda para evaluar db4o, solo dame un grito.

Jason: para llegar a cualquier miembro de db4o debes usar este patrón: firstname @ db4o.com ¡Mejor!

  • Java.lang.StackOverflowError
  • Consulta SQLite de Android donde columna no es nula y no vacía
  • ¿Cómo realizar una consulta SQLite dentro de una aplicación de Android?
  • SQLite Android - parámetros nombrados
  • Android Rating Bar muestra sólo estrellas completas, no media estrellas también
  • ¿Cómo puedo mantener mi base de datos en una tarjeta SD y utilizar ORMLite?
  • GreenDao freemaker.jar está ausente
  • ¿Cuál es la forma correcta de hacer inserciones / actualizaciones / eliminaciones en Android SQLiteDatabase utilizando una cadena de consulta?
  • Consultar tabla con subclases-como las relaciones
  • Android NullPointerException al ejecutar la consulta en la base de datos SQLite
  • Usar insertWithOnConflict para actualizar o insertar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.