ventajas uso usar tutorial estructuras español desventajas datos caracteristicas bases nosql database-relations

uso - ¿Cómo rastreas las relaciones de registro en NoSQL?



sql y nosql ventajas y desventajas (5)

  1. user: userid: comments es un enfoque razonable: piense en ello como el equivalente de un índice de columna en SQL, con el requisito adicional de que no puede consultar columnas sin indizar.

  2. Aquí es donde necesita pensar en sus requisitos. Una lista con 30 millones de artículos no es irracional porque es lenta, sino porque no es práctico hacer nada con ella. Si su requisito real es mostrar algunos comentarios recientes, es mejor que mantenga una lista muy corta que se actualiza cada vez que se agrega un comentario: recuerde que NoSQL no tiene requisitos de normalización. Las condiciones de carrera son un problema con las listas en un almacén de valores de clave básico, pero generalmente su plataforma admite listas correctamente, puede hacer algo con bloqueos, o no le importan las actualizaciones fallidas.

  3. Lo mismo que para los comentarios de los usuarios: cree una palabra clave de índice: publicaciones

  4. Más de lo mismo - probablemente una lista de clubes como propiedad de estudiantes y un índice en ese campo para obtener todos los miembros de un club

Estoy tratando de descubrir el equivalente de claves e índices foráneos en las bases de datos NoSQL KVP o Document. Dado que no hay tablas pivote (para agregar teclas que marcan una relación entre dos objetos), realmente estoy perplejo en cuanto a cómo podría recuperar datos de una manera que sería útil para las páginas web normales.

Supongamos que tengo un usuario, y este usuario deja muchos comentarios en todo el sitio. La única forma en que puedo pensar para hacer un seguimiento de los comentarios de los usuarios es

  1. Incrustarlos en el objeto de usuario (que parece bastante inútil)
  2. Cree y mantenga un user_id:comments valor de user_id:comments que contiene una lista de la clave de cada comentario [comment: 34, comment: 197, etc ...] para que pueda buscarlos según sea necesario.

Sin embargo, tomando el segundo ejemplo, pronto tocará una pared de ladrillos cuando la use para rastrear otras cosas como una clave llamada "active_comments" que podría contener 30 millones de identificadores, por lo que costar un TON consultar cada página solo para conocer algunas recientes comentarios activos. También sería muy propenso a las condiciones de carrera ya que muchas páginas podrían intentar actualizarlo al mismo tiempo.

¿Cómo puedo rastrear relaciones como las siguientes en una base de datos NoSQL?

  • Todos los comentarios de un usuario
  • Todos los comentarios activos
  • Todas las publicaciones etiquetadas con [palabra clave]
  • Todos los estudiantes en un club - o todos los clubes en los que se encuentra un estudiante

¿O estoy pensando en esto incorrectamente?


Creo que RavenDB ofrece una buena solución a este problema con la indexación. La información en la página principal http://ravendb.net/ explica el concepto lo suficientemente bien como para que puedas crear algo similar para tu tecnología.


El enfoque de couchDB sugiere emitir clases adecuadas de material en la fase del mapa y resumirlo en reducir. Por lo tanto, podría mapear todos los comentarios y emitir 1 para el usuario dado y luego imprimir solo los. Sin embargo, requeriría mucho almacenamiento en disco para construir vistas persistentes de todos los datos rastreables en couchDB. Por cierto, también tienen esta página wiki sobre relaciones: http://wiki.apache.org/couchdb/EntityRelationship .

Riak por otro lado tiene una herramienta para construir relaciones. Es un enlace. Puede ingresar la dirección de un documento vinculado (aquí comentario) en el documento ''raíz'' (aquí documento de usuario). Tiene un truco. Si se distribuye, puede modificarse al mismo tiempo en muchos lugares. Causará conflictos y, como resultado, un enorme árbol de reloj vectorial: / ... no tan malo, no tan bueno.

Riak también tiene otro ''mecanismo''. Tiene un espacio de nombre de clave de 2 capas, llamado cubo y clave. Entonces, para el ejemplo de un estudiante, si tenemos el club A, B y C y el estudiante StudentX, StudentY, puede mantener la siguiente convención:

{ Key = {ClubA, StudentX}, Value = true }, { Key = {ClubB, StudentX}, Value = true }, { Key = {ClubA, StudentY}, Value = true }

y para leer la relación solo enumera las claves en los cubos dados. ¿Qué está mal con eso? Es muy lento El listado de cubos nunca fue una prioridad para riak. Está mejorando cada vez más. por cierto. no desperdicia memoria porque este ejemplo {true} se puede vincular al perfil único completo de StudentX o Y (aquí los conflictos no son posibles).

Como lo ve, ¡NoSQL! = NoSQL. Necesita ver la implementación específica y probarla usted mismo.

Mencionado antes, las tiendas Columna parecen aptas para las relaciones ... pero todo depende de tus necesidades A, C y P;) Si no necesitas A y tienes menos de Peta, déjalo, sigue con MySql o Postgres.

buena suerte


Tienes

"user": { "userid": "unique value", "category": "student", "metainfo": "yada yada yada", "clubs": ["archery", "kendo"] } "comments": { "commentid": "unique value", "pageid": "unique value", "post-time": "ISO Date", "userid": "OP id -> THIS IS IMPORTANT" } "page": { "pageid": "unique value", "post-time": "ISO Date", "op-id": "user id", "tag": ["abc", "zxcv", "qwer"] }

Bueno, en una base de datos relacional, lo normal sería tener una relación uno a muchos para normalizar los datos. Eso es lo mismo que harías en una base de datos NoSQL también. Simplemente indexe los campos con los que va a recuperar la información.

Por ejemplo, los índices importantes para usted son

  • Comment.UserID
  • Comment.PageID
  • Comment.PostTime
  • Page.Tag []

Si está utilizando NosDB (una base de datos NoSQL basada en .NET con soporte SQL) sus consultas serán como

SELECT * FROM Comments WHERE userid = ‘That user’; SELECT * FROM Comments WHERE pageid = ‘That user’; SELECT * FROM Comments WHERE post-time > DateTime(''2016, 1, 1''); SELECT * FROM Page WHERE tag = ''kendo''

Compruebe todos los tipos de consultas compatibles desde su hoja de referencia o documentación de SQL .


Todas las respuestas sobre cómo almacenar asociaciones de muchos a muchos en el "modo NoSQL" se reducen a lo mismo: almacenar datos de forma redundante.

En NoSQL, no diseña su base de datos en función de las relaciones entre las entidades de datos. Usted diseña su base de datos según las consultas que ejecutará contra ella. Utilice los mismos criterios que usaría para desnormalizar una base de datos relacional: si es más importante que los datos tengan cohesión (piense en valores en una lista separada por comas en lugar de una tabla normalizada), hágalo de esa manera.

Pero esto se optimiza inevitablemente para un tipo de consulta (por ejemplo, comentarios de un usuario para un artículo determinado) a expensas de otros tipos de consultas (comentarios para cualquier artículo de un usuario determinado). Si su aplicación necesita que ambos tipos de consultas estén igualmente optimizados, no debe desnormalizarse. Asimismo, no debe usar una solución NoSQL si necesita usar los datos de una manera relacional.

Existe un riesgo de desnormalización y redundancia de que los conjuntos de datos redundantes se desincronicen entre sí. Esto se llama una anomalía . Cuando utiliza una base de datos relacional normalizada, el RDBMS puede evitar anomalías. En una base de datos desnormalizada o en NoSQL, será su responsabilidad escribir el código de la aplicación para evitar anomalías.

Uno podría pensar que sería genial para una base de datos NoSQL hacer el trabajo duro de prevenir anomalías para usted. Hay un paradigma que puede hacer esto: el paradigma relacional.