tablas relacionales relacional motores modelo ejemplos ejemplo diagrama datos cuadro comparativo bases google-app-engine data-modeling relational-database non-relational-database

google app engine - motores - Modelado de datos relacionales y no relacionales: ¿cuál es la diferencia?



motores de bases de datos no relacionales (3)

Soy nuevo en las bases de datos y nunca he trabajado con ningún RDBMS. Sin embargo tengo la idea básica de las bases de datos relacionales. Por lo menos creo que lo hago ;-)

Digamos que tengo una base de datos de usuarios con las siguientes propiedades para cada usuario:

  • usuario
    • carné de identidad
    • nombre
    • cremallera
    • ciudad

En una base de datos relacional , por ejemplo, lo modelaría en una tabla llamada user

  • usuario
    • carné de identidad
    • nombre
    • location_id

y tener una segunda mesa llamada location

  • ubicación
    • carné de identidad
    • cremallera
    • ciudad

Y location_id es una clave externa (referencia) a una entrada en la tabla de location . Si lo entiendo bien, la ventaja está aquí, si el código postal de una ciudad determinada cambia, solo tengo que cambiar exactamente una entrada.

Entonces, vamos a la base de datos no relacional , donde comencé a jugar con Google App Engine. Aquí realmente lo modelaría como si estuviera escrito primero en las especificaciones. Tengo un user amable:

class User(db.Model): name = db.StringProperty() zip = db.StringProperty() city = db.StringProperty()

La ventaja es que no necesito unir dos "tablas", pero la desventaja es que si el código postal cambia, tengo que ejecutar un script que pasa por todas las entradas de usuario y actualiza el código postal, ¿correcto?

Entonces, ahora hay otra opción en Google App Engine, que es usar ReferenceProperties . Podría tener dos tipos: user y location

class Location(db.Model): zip = db.StringProperty() city = db.StringProperty() class User(db.Model): name = db.StringProperty() location = db.ReferenceProperty(Location)

Si no estoy equivocado, ahora tengo exactamente el mismo modelo que en la base de datos relacional descrita anteriormente. Lo que me pregunto ahora es, en primer lugar, que está mal lo que acabo de hacer y que destruye todas las ventajas de una base de datos no relacional. Entiendo que para obtener el valor de zip y city tengo que ejecutar la segunda consulta. Pero en el otro caso, para realizar un cambio en el código postal, debo ejecutar todos los usuarios existentes.

¿Cuáles son las implicaciones de estas dos posibilidades de modelado en una base de datos no relacional como el almacén de datos de Google? Y cuáles son los casos de uso típicos de ambos, es decir, cuándo debo usar uno y cuándo el otro.

También como una pregunta adicional, si en una base de datos sin relación puedo modelar exactamente lo mismo que puedo modelar en una base de datos relacional, ¿por qué debería usar una base de datos relacional?

Lo siento si algunas de estas preguntas suenan ingenuas, pero estoy seguro de que ayudarán a un par de personas, que son nuevas en los sistemas de bases de datos, para obtener una mejor comprensión.


En mi experiencia, la mayor diferencia es que los almacenes de datos no relacionales te obligan a modelar según la forma en que realizarás consultas, debido a la falta de uniones y cómo escribirás, debido a las restricciones de transacción. Esto, por supuesto, resulta en modelos muy desnormalizados. Después de un tiempo, comencé a definir todas las consultas primero , para evitar tener que repensar los modelos más tarde.

Debido a la flexibilidad de las bases de datos relacionales, puede pensar en cada familia de datos por separado, crear relaciones entre ellos y, al final, consultar cómo desea (abusar de las uniones en muchos casos).


Imagine que GAE tiene dos modos para el almacén de datos: modo RDMS y modo no RDMS. Si tomo su ejemplo de Propiedad de referencia con el objetivo de "enumerar a todos los usuarios y todos sus códigos postales" y escribir algún código para imprimir todo esto.

Para el almacén de datos en modo RDMS [ficticio] podría verse como:

for user in User.all().join("location"): print("name: %s zip: %s" % (user.name, user.location.zip))

Nuestro sistema RDMS ha manejado la des-normalización de los datos detrás de los senes y ha hecho un buen trabajo al devolver todos los datos que necesitábamos en una consulta. Esta consulta tuvo un poco de sobrecarga ya que tuvo que unir nuestras dos tablas.

Para el almacén de datos que no es RDMS, nuestro código podría ser:

for user in User.all(): location = Location.get( user.location )† print("name: %s zip: %s" % (user.name, location.zip))

Aquí, el almacén de datos no puede ayudarnos a unir nuestros datos, y debemos realizar una consulta adicional para cada entidad de user para obtener la location antes de que podamos imprimirla.

Esto es, en esencia, el motivo por el que desea evitar datos demasiado normalizados en sistemas que no son RDMS.

Ahora, todos lógicamente normalizan sus datos hasta cierto punto, ya sea que estén usando RDMS o no, el truco consiste en encontrar el equilibrio entre la comodidad y el rendimiento para su caso de uso.

† este no es un código de aplicación válido, solo estoy ilustrando que user.location una consulta db. Además, nadie debería escribir código como en mi ejemplo extremo anterior, puede evitar la búsqueda continua de entidades relacionadas, por ejemplo, recuperar ubicaciones en lotes por adelantado.

Si en una base de datos sin relación puedo modelar exactamente lo mismo que puedo modelar en una base de datos relacional, ¿por qué debería usar una base de datos relacional?

El DB relacional es excelente para almacenar miles y millones de filas de complejos modelos de datos interrelacionados, y le permite realizar consultas increíblemente complejas para reformar y acceder a esos datos.

los que no son RDB sobresalen en almacenar miles de millones + filas de datos simples y le permiten obtener esos datos con consultas más simples.

La elección debería ser su caso de uso realmente. La estructura más simple del modelo no relacional y las restricciones de diseño que lo acompañan es una de las formas principales en que AppEngine puede prometer escalar su aplicación según la demanda.


Su comprensión del concepto de la base de datos relacional es defectuosa. Las bases de datos relacionales organizan sus datos en relaciones que contienen un conjunto de tuplas del mismo tipo. Para reformular, los datos se almacenan en tablas con cada fila que contiene el mismo número de campos con los mismos tipos en el mismo orden.

El ejemplo que proporcionó que utiliza una clave externa demuestra la normalización de la base de datos . Este es un concepto que puede aplicarse tanto a bases de datos relacionales como a otros tipos de bases de datos.

Lo sentimos, no puedo responder sus preguntas sobre el sistema de almacenamiento de Google, pero espero que esto aclare su comprensión lo suficiente como para averiguarlo.