Desde el almacén de datos de Google App Engine se basa en Bigtable y sabemos que no es una base de datos relacional, ¿cómo diseñar una base de datos esquema de modelo de datos / para aplicaciones que utilizan este tipo de sistema de base de datos?¿Cómo se diseñan los modelos de datos para Bigtable/Datastore (GAE)?
Respuesta
El diseño de un esquema de Bigtable es un proceso abierto, y, básicamente, se requiere pensar en:
- Los patrones de acceso que va a utilizar y con qué frecuencia cada uno se utilizarán
- Las relaciones entre los tipos (carga con el fin de difundir de manera efectiva)
- Qué índices que van a necesitar
- Los patrones de escritura que va a utilizar
El almacén de datos de GAE automáticamente desnormaliza sus datos. Es decir, cada índice contiene una copia (la mayoría) completa de los datos y, por lo tanto, todos los índices aumentan significativamente el tiempo empleado para realizar una escritura y el espacio de almacenamiento utilizado.
Si este no fuera el caso, diseñar un esquema de Datastore sería mucho más trabajo: Tendría que pensar cuidadosamente sobre la clave principal para cada tipo, y considerar el efecto de su decisión sobre la localidad de los datos. Por ejemplo, cuando represente una publicación de blog, probablemente necesite mostrar los comentarios para que coincidan con ella, por lo que la clave de cada comentario probablemente comience con la clave de la publicación asociada.
Con Datastore, esto no es un gran problema: la consulta que use se verá algo así como "Seleccionar * FROM Comentar DONDE post_id = N." (Si desea colocar los comentarios en la página, también tendrá una cláusula de límite y un posible sufijo de "AND comment_id> last_comment_id"). Una vez que agregue dicha consulta, Datastore creará el índice por usted, y sus lecturas serán mágicamente rápido.
Algo a tener en cuenta es que cada índice adicional crea un costo adicional: es mejor si puede usar los menos patrones de acceso posibles, ya que reducirá el número de índices que GAE construirá y por lo tanto el almacenamiento total requerido por sus datos.
Leyendo esta respuesta, me parece un poco vago. Tal vez una pregunta de diseño práctico ayudaría a entender esto? :-)
El almacén de datos GAE no "automatiza automáticamente la desnorización de sus datos". Automáticamente _indexa_ la mayoría de las columnas, pero eso es totalmente diferente. –
El almacén de datos tampoco crea automáticamente índices para usted, el dev appserver sí lo hace. Si no realiza una consulta en particular en el servidor de aplicaciones dev, no agregará la entrada apropiada a indexes.yaml, y la consulta fallará cuando se implemente. –
He leído en alguna parte que cada índice contiene una copia de _todos_ campos para devolver; Sin embargo, ahora los documentos indican que solo se almacenan dentro de ella las columnas que afectan al índice. AFAICT no hay ningún lugar que indique si una lectura de índice es un escaneo simple, o escaneo + búsqueda. ¿Has visto algo sobre eso? – 0124816
Como GAE se basa en cómo se administran los datos en Django, hay mucha información sobre cómo abordar preguntas similares en la documentación de Django (por ejemplo, consulte here, desplácese hasta 'Su primer modelo').
En resumen, usted diseña su modelo db como un modelo de objeto regular y deja que GAE ordene todas las asignaciones relacionales de objetos.
consejo muy malo ... Django funciona solo en bases de datos relacionales. Si desea ver algunas prácticas hay un djano-nonrel que puede proporcionar inspiración ... –
Puede usar www.web2py.com. Usted construye el modelo y la aplicación una vez y funciona en GAE pero también con SQLite, MySQL, Posgres, Oracle, MSSQL, FireBird
Eso es solo técnicamente correcto. Una base de datos relacional basada en esquema normal puede funcionar en GAE una vez que eliminas las OR y las UNIONES. Pero está muy lejos de estar diseñado para adaptarse a GAE y lo es de otra manera ... –
- 1. ¿Cómo se diseñan los mensajes de validación de formularios HTML5?
- 2. ¿Cómo se diseñan sistemas complejos con TDD?
- 3. ¿Cómo se diseñan las plantillas de software y juegos?
- 4. haystack: ¿cómo muestra los datos de varios modelos con ForeignKeys?
- 5. validación de datos para modelos declarativos SQLAlchemy
- 6. ¿Los modelos de vista se usan en los rieles?
- 7. GAE descarga de datos muestra datastore_errors.BadRequestError
- 8. Práctica recomendada para mantener los modelos y los modelos de vista sincronizados
- 9. Redactar consultas en los modelos de datos de entidad
- 10. Cómo verificar el almacén de datos de GAE local
- 11. Analizador HTML para GAE
- 12. En Magento, ¿cómo toman los bloques los datos de los modelos?
- 13. ¿Cómo funcionan los modelos Django?
- 14. Datos de carga masiva en el almacén de datos para el proyecto GAE Java
- 15. Rieles: ¿Cómo funcionan los modelos autorreferenciales has_many?
- 16. actualizar la base de datos django para reflejar los cambios en los modelos existentes
- 17. SQLAlchemy "event.listen" para todos los modelos
- 18. Teclas personalizadas para los modelos de Google App Engine (Python)
- 19. GAE API para encontrar dónde se está ejecutando la aplicación: máquina local O gae cloud
- 20. Creación automática de fórmulas para todos los posibles modelos lineales
- 21. GAE y Django: ¿Cuáles son los beneficios?
- 22. Protocol Buffers y modelos de datos internos
- 23. ¿Cuándo se lanza la ConcurrentModificationException en GAE?
- 24. Modelos de datos útiles de SQL?
- 25. Django: ¿Cambiar modelos sin borrar todos los datos?
- 26. ¿Cómo implementar efectivamente sesiones en GAE?
- 27. ¿Cómo "SECAR" los atributos de C# en Modelos y Modelos de Vista?
- 28. ¿Cómo funcionan los modelos Wicket con genéricos?
- 29. Listando los nombres de los modelos asociados
- 30. consumidor OpenID para JAVA GAE
Consulte [esta pregunta] (http://stackoverflow.com/questions/103727/how- to-think-in-data-stores-instead-of-databases), que pregunta más o menos lo mismo. –