2011-06-22 16 views
7

Duplicar posible:
How to represent the data for threaded comments(along with comment voting) in mongodb?¿Cómo funciona realmente mongoDB?

Vengo de MySQL mundo y han decidido aprender a usar MongoDB. Mi próximo proyecto será similar a Reddit.com con comentarios y votaciones de múltiples niveles. ¿Puedes guiarme a un buen recurso para entender cómo crear aplicaciones usando mongodb? Entiendo cómo funciona el almacenamiento básico de documentos, pero no puedo entender cómo almacenaría el árbol de comentarios y la información del usuario en un documento y lo actualizaría si alguien actualiza su información de usuario. Básicamente, estoy buscando una guía para migrar de mysql a mongodb.

Cualquier consejo/guía es muy apreciado.

+0

también similar: http://stackoverflow.com/questions/5262669/nested-comments-in-mongodb y http://stackoverflow.com/questions/5144273/mongodb-document-design-for-comments-and-their-reply-comments – Thilo

Respuesta

5

La razón por la que está teniendo problemas para entenderlo es porque MongoDB no es un relational database, es un document-oriented database. Para algo simple como un árbol de comentarios con una estructura muy establecida y una relación de uno a muchos, probablemente sería mejor que se quedara con MySQL. El perfil del usuario puede ser algo interesante para usar MongoDB, pero una vez más, si está muy estructurado, es posible que estés mejor con MySQL.

Es posible que desee determinar qué aspectos del proyecto son más adecuados para una base de datos orientada a documentos (IE: datos no estructurados) y qué aspectos sería mejor usar una base de datos relacional más tradicional y luego usar ambos.

una pregunta anterior que pedí tiene una buena visión general de ambos: Are document-oriented databases meant to replace relational databases?

También he estado usando tanto en proyectos con mucho éxito, aunque sí tener una cantidad sustancial de configuración inicial como la mayoría de los marcos hacen no permitir la implementación de ambos con demasiada facilidad.

+0

Espero tener que tener miles de comentarios en documento único, todos en diferentes niveles. Hacer esto con mysql es muy caro y es por eso que decidí que usaría nosql. ¿Crees que estoy en el camino correcto aquí? – DavidW

+0

Estructurado o no, no decide usar MongoDB o MySQL. En realidad, incluso cuando se utiliza MongoDB, su aplicación está altamente estructurada y utiliza un esquema. También relacional no es un indicador. Sus datos son casi siempre relacionales. MongoDB no admite uniones, pero puedes construir datos relacionales en MongoDB sin problemas. En mi opinión, MongoDB te brinda un mejor soporte para los datos relacionales, porque puedes insertarlos directamente en un documento, y tu almacenamiento de datos se parece más a tus "clases" en tu código, que poner todo en un diseño de tabla con una gran cantidad de referencias. –

+0

@Sid Quemar por datos estructurados me refiero a datos que pueden encajar bien en las columnas, todos los datos de la base de datos tienen, por supuesto, algún tipo de estructura. @ user720943 es una decisión difícil de tomar, posiblemente un poco más de investigación esté disponible para ver: http://stackoverflow.com/questions/1476295/when-to-use-mongodb-or-other-document-oriented -database-systems – tplaner

8

Algunas reglas de oro que he encontrado útiles son esto:

  • Si sólo hay una copia lógica de una pieza de información, que debe estar en un solo documento (por ejemplo, si tiene comentarios en una publicación, el método más simple es insertarlos en la publicación)

  • Si desea desnormalizar datos en SQL land en otra tabla para evitar uniones y otras cosas, el mismo comportamiento se aplica al almacenamiento de documentos: desnormalizar de uno " principal "ubicación en copias en otros lugares. Las copias deben considerarse como copias y no como información de origen, por lo que pueden sobrescribirse con futuras acciones de desnormalización.

  • Si tiene que acceder a un conjunto de datos canónico, como una cuenta de usuario, desde múltiples ubicaciones, almacene referencias como ObjectId s en mongodb, luego ejecute una segunda consulta para el documento relacionado. Usted debe tenga en cuenta en su solicitud que la segunda consulta no es una unión, y no bloqueará ambos documentos para garantizar la coherencia, por lo que puede haber incoherencias en los resultados.

Esencialmente, usted debe pensar en su base de datos como coherente a nivel de documento. Cualquier consulta de documentos relacionados puede ser inconsistente, por lo que si necesita consistencia, puede desnormalizar esos datos en un solo documento.

Si necesidad la cuenta de usuario sea exactamente consistente con sus comentarios, se tiene que copiar la información relevante junto a sus comentarios al mismo tiempo que se escriben los comentarios en el documento. Esto significa que debe pensar en la coherencia a nivel de aplicación, todo el tiempo. Si no es así, como sospecho que es el caso, solo emita otra consulta para el usuario.

Si le preocupa el rendimiento en la consulta de datos de todos los usuarios que participan en su página, recomendaría copiar algunos datos de la cuenta de usuario junto al comentario, pero solo leer de esta copia; debe escriba en sus cuentas de usuario originales.

Eso es todo lo que viene a la mente por ahora, pero puede editar como las cosas ocurren a mí :)

Cuestiones relacionadas