¿Cómo pensar en almacenes de datos en lugar de bases de datos?

183

Como ejemplo, Google App Engine utiliza Google Datastore, no una base de datos estándar, para almacenar datos. ¿Alguien tiene algún consejo para usar Google Datastore en lugar de bases de datos? Parece que he entrenado mi mente para pensar al 100% en las relaciones de objeto que se asignan directamente a las estructuras de la tabla, y ahora es difícil ver algo diferente. Puedo entender algunos de los beneficios de Google Datastore (por ejemplo, el rendimiento y la capacidad de distribuir datos), pero se sacrifica una buena funcionalidad de la base de datos (por ejemplo, se une).

¿Alguien que haya trabajado con Google Datastore o BigTable tiene algún buen consejo para trabajar con ellos?

Jim
fuente
DataSource es una antigua API que estamos eliminando gradualmente; estaba muy vinculada a un modelo de conexión de base de datos. DataStore es la API de bajo nivel que permite el acceso a un enfoque basado en streaming "sin procesar" para el contenido SIG, utilizando FeatureReaders y FeatureWriter.
murali
Ahora Google Cloud SQL proporciona soporte de base de datos relacional para Google App Engine. Si todavía busca una solución para los almacenes de datos, puede usar Google Cloud SQL .
Chandana
Es posible que desee consultar la API de Mungo Datastore: bit.ly/13eSDpr
quarks

Respuestas:

149

Hay dos cosas principales para acostumbrarse al almacén de datos de App Engine en comparación con las bases de datos relacionales 'tradicionales':

  • El almacén de datos no distingue entre inserciones y actualizaciones. Cuando llama a put () en una entidad, esa entidad se almacena en el almacén de datos con su clave única, y todo lo que tenga esa clave se sobrescribe. Básicamente, cada tipo de entidad en el almacén de datos actúa como un mapa enorme o una lista ordenada.
  • La consulta, como aludiste, es mucho más limitada. No se une, para empezar.

La clave para darse cuenta, y la razón detrás de estas dos diferencias, es que Bigtable básicamente actúa como un enorme diccionario ordenado. Por lo tanto, una operación de venta solo establece el valor de una clave determinada, independientemente de cualquier valor anterior para esa clave, y las operaciones de recuperación se limitan a recuperar claves individuales o rangos contiguos de claves. Las consultas más sofisticadas son posibles gracias a los índices, que son básicamente tablas propias, lo que le permite implementar consultas más complejas como escaneos en rangos contiguos.

Una vez que haya absorbido eso, tiene los conocimientos básicos necesarios para comprender las capacidades y limitaciones del almacén de datos. Las restricciones que pueden haber parecido arbitrarias probablemente tengan más sentido.

La clave aquí es que, aunque estas son restricciones sobre lo que puede hacer en una base de datos relacional, estas mismas restricciones son las que hacen que sea práctico escalar al tipo de magnitud que Bigtable está diseñado para manejar. Simplemente no puede ejecutar el tipo de consulta que se ve bien en papel pero es atrozmente lenta en una base de datos SQL.

En términos de cómo cambiar la forma en que representa los datos, lo más importante es el cálculo previo. En lugar de hacer uniones en el momento de la consulta, precalcule los datos y almacénelos en el almacén de datos siempre que sea posible. Si desea elegir un registro aleatorio, genere un número aleatorio y guárdelo con cada registro. Hay todo un libro de cocina de este tipo de consejos y trucos aquí Editar: El libro de cocina ya no está en existencia.

Nick Johnson
fuente
44
Buenas noticias, Internet no se ha olvidado del libro de cocina, es decir, el archivo de Internet no se ha olvidado. El fantasma del sitio todavía existe aquí: web.archive.org/web/20090416113704/http://…
EasilyBaffled
42

La forma en que me he ocupado del cambio mental es olvidarme de la base de datos por completo.

En el mundo relacional de la base de datos, siempre debe preocuparse por la normalización de datos y la estructura de su tabla. Deshazte de todo. Simplemente diseñe su página web. Extiéndelos a todos. Ahora míralos. Ya estás 2/3 allí.

Si olvida la noción de que el tamaño de la base de datos es importante y los datos no deben duplicarse, entonces está 3/4 allí y ¡ni siquiera tuvo que escribir ningún código! Deje que sus puntos de vista dicten sus Modelos. Ya no tienes que tomar tus objetos y hacerlos bidimensionales como en el mundo relacional. Puede almacenar objetos con forma ahora.

Sí, esta es una explicación simplificada de la prueba, pero me ayudó a olvidarme de las bases de datos y simplemente hacer una solicitud. Hasta ahora he creado 4 aplicaciones de App Engine utilizando esta filosofía y hay más por venir.

user19087
fuente
2
Me gusta el "Deje que sus puntos de vista dicten sus Modelos". poco. Creo que es un problema de RDBMS, pero simplifica todo.
cbednarski
23

Siempre me río cuando la gente sale, no es relacional. He escrito cellectr en django y aquí hay un fragmento de mi modelo a continuación. Como verá, tengo ligas administradas o entrenadas por los usuarios. Puedo obtener todos los gerentes de una liga, o de un usuario determinado puedo devolver la liga que ella entrena o maneja.

El hecho de que no haya soporte específico de clave externa no significa que no pueda tener un modelo de base de datos con relaciones.

Mis dos peniques.


class League(BaseModel):
    name = db.StringProperty()    
    managers = db.ListProperty(db.Key) #all the users who can view/edit this league
    coaches = db.ListProperty(db.Key) #all the users who are able to view this league

    def get_managers(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.managers)

    def get_coaches(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.coaches)      

    def __str__(self):
        return self.name

    # Need to delete all the associated games, teams and players
    def delete(self):
        for player in self.leagues_players:
            player.delete()
        for game in self.leagues_games:
            game.delete()
        for team in self.leagues_teams:
            team.delete()            
        super(League, self).delete()

class UserPrefs(db.Model):
    user = db.UserProperty()
    league_ref = db.ReferenceProperty(reference_class=League,
                            collection_name='users') #league the users are managing

    def __str__(self):
        return self.user.nickname

    # many-to-many relationship, a user can coach many leagues, a league can be
    # coached by many users
    @property
    def managing(self):
        return League.gql('WHERE managers = :1', self.key())

    @property
    def coaching(self):
        return League.gql('WHERE coaches = :1', self.key())

    # remove all references to me when I'm deleted
    def delete(self):
        for manager in self.managing:
            manager.managers.remove(self.key())
            manager.put()
        for coach in self.managing:
            coach.coaches.remove(self.key())
            coaches.put()            
        super(UserPrefs, self).delete()    
Phil Stollery
fuente
12

Vengo del mundo de la base de datos relacional y luego encontré esta cosa del almacén de datos. tardó varios días en acostumbrarse. bueno, hay algunos de mis hallazgos.

Ya debe haber sabido que Datastore está construido a escala y eso es lo que lo separa de RDMBS. para escalar mejor con grandes conjuntos de datos, App Engine ha realizado algunos cambios (algunos significan muchos cambios).


Estructura de RDBMS VS DataStore
En la base de datos, generalmente estructuramos nuestros datos en Tablas, Filas que están en Datastore se convierten en Tipos y Entidades .

Relaciones
En RDBMS, la mayoría de las personas siguen la relación uno a uno, muchos a uno, muchos a muchos, en el almacén de datos, ya que tiene la opción "No unirse", pero aún podemos lograr nuestra normalización usando " ReferenceProperty "Ejemplo de relación uno a uno .

Índices
Por lo general, en RDMBS hacemos índices como Clave primaria, Clave externa, Clave única e Clave de índice para acelerar la búsqueda y aumentar el rendimiento de nuestra base de datos. En el almacén de datos, usted tiene que hacer al menos un índice por tipo (será automáticamente generar ya sea que nos guste o no) porque almacén de datos buscar su entidad sobre la base de estos índices y yo creo que es la mejor parte, en el RDBMS puede realizar búsquedas con campo sin índice, aunque llevará algún tiempo, pero lo hará. En el almacén de datos no puede buscar utilizando propiedades que no sean de índice.

Recuento
En RDMBS, es mucho más fácil contar (*) pero en el almacén de datos, ni siquiera lo piense de manera normal (sí, hay una función de recuento) ya que tiene un límite de 1000 y costará una operación tan pequeña como la entidad que no es bueno pero siempre tenemos buenas opciones, podemos usar Shard Counters .

Restricciones únicas
En RDMBS, nos encanta esta característica ¿verdad? pero Datastore tiene su propio camino. no puede definir una propiedad como única :(.

Query
GAE Datatore proporciona una mejor característica mucho ME GUSTA (¡Oh, no! El almacén de datos no tiene LIKE Keyword) SQL que es GQL .

Insertar / actualizar / eliminar / seleccionar datos
Aquí es donde todos estamos interesados, ya que en RDMBS requerimos una consulta para Insertar, Actualizar, Eliminar y Seleccionar al igual que RDBMS, Datastore ha puesto, eliminado, obtiene (no se emocione demasiado) porque Datastore poner u obtener en términos de escritura, lectura, pequeñas operaciones ( costos de lectura para llamadas al almacén de datos ) y ahí es donde entra en acción el modelado de datos. debe minimizar estas operaciones y mantener su aplicación en funcionamiento. Para la operación de reducción de lectura puede usar Memcache .

sanjay kushwah
fuente
6

Echa un vistazo a la documentación de Objectify. El primer comentario al final de la página dice:

"Agradable, aunque escribiste esto para describir Objectify, también es una de las explicaciones más concisas del almacén de datos de appengine que he leído. Gracias".

https://github.com/objectify/objectify/wiki/Concepts

Jon Stevens
fuente
3

Si está acostumbrado a pensar en entidades asignadas a ORM, entonces básicamente es así como funciona un almacén de datos basado en entidades como App Engine de Google. Para algo como uniones, puede mirar las propiedades de referencia . Realmente no debe preocuparse si usa BigTable para el backend o algo más, ya que el backend está abstraído por las interfaces API de GQL y Datastore.

Mark Cidade
fuente
1
Un problema con las propiedades de referencia es que pueden crear rápidamente un problema de consulta 1 + N. (Extraiga 1 consulta para encontrar 100 personas, luego haga otra consulta para que cada una de ellas obtenga la dirección de persona).
0124816
El enlace a las 'propiedades de referencia' está roto, probablemente mediante la adición de compatibilidad con Java. Prueba: code.google.com/appengine/docs/python/datastore/…
Spike0xff
Enlace fijo. siéntase libre de editar cualquier respuesta si tiene suficiente reputación.
Mark Cidade
0

La forma en que miro el almacén de datos es, kind identifica la tabla, per se, y la entidad es una fila individual dentro de la tabla. Si Google fuera a sacar un tipo que es solo una gran tabla sin estructura y puede volcar lo que quiera en una entidad. En otras palabras, si las entidades no están vinculadas a un tipo, prácticamente puede tener cualquier estructura a una entidad y almacenarse en una ubicación (tipo de archivo grande sin estructura, cada línea tiene estructura propia).

Ahora volviendo al comentario original, el almacén de datos de Google y la tabla grande son dos cosas diferentes, así que no confunda el almacén de datos de Google con el sentido de almacenamiento de datos del almacén de datos. Bigtable es más caro que bigquery (razón principal por la que no fuimos con él). Bigquery tiene combinaciones apropiadas y RDBMS como lenguaje SQL y es más barato, ¿por qué no usar bigquery? Dicho esto, bigquery tiene algunas limitaciones, dependiendo del tamaño de sus datos que puede encontrar o no.

Además, en términos de pensar en términos de almacén de datos, creo que la declaración adecuada habría sido "pensar en términos de bases de datos NoSQL". Hay demasiados disponibles en estos días, pero cuando se trata de productos de Google, excepto Google Cloud SQL (que es MySQL), todo lo demás es NoSQL.

ringadingding
fuente
-6

Al estar arraigado en el mundo de las bases de datos, un almacén de datos para mí sería una tabla gigante (de ahí el nombre de "tabla grande"). Sin embargo, BigTable es un mal ejemplo porque hace muchas otras cosas que una base de datos típica podría no hacer, y aún así es una base de datos. Lo más probable es que, a menos que sepa que necesita construir algo como la "tabla grande" de Google, probablemente estará bien con una base de datos estándar. Lo necesitan porque están manejando cantidades inimaginables de datos y sistemas juntos, y ningún sistema comercialmente disponible puede realmente hacer el trabajo de la manera exacta en que pueden demostrar que necesitan hacer el trabajo.

(referencia de tabla grande: http://en.wikipedia.org/wiki/BigTable )

devinmoore
fuente
La pregunta se relaciona específicamente con Google App Engine, que usa Bigtable; Usar una base de datos relacional no es una opción.
Nick Johnson