Esta división fue analizado por nuestros expertos para asegurar la veracidad de nuestro post.
Solución:
Tomemos un ejemplo para eso. Supongamos que tenemos un esquema de base de datos para una aplicación de prueba que se ve así:
Firestore-root
|
--- questions (collections)
|
--- questionId (document)
|
--- questionId: "LongQuestionIdOne"
|
--- title: "Question Title"
|
--- tags (collections)
|
--- tagIdOne (document)
| |
| --- tagId: "yR8iLzdBdylFkSzg1k4K"
| |
| --- tagName: "History"
| |
| --- //Other tag properties
|
--- tagIdTwo (document)
|
--- tagId: "tUjKPoq2dylFkSzg9cFg"
|
--- tagName: "Geography"
|
--- //Other tag properties
En el cual tags
es una subcolección dentro questionId
objeto. Vamos a crear ahora el tags
colección como una colección de nivel superior como esta:
Firestore-root
|
--- questions (collections)
| |
| --- questionId (document)
| |
| --- questionId: "LongQuestionIdOne"
| |
| --- title: "Question Title"
|
--- tags (collections)
|
--- tagIdOne (document)
| |
| --- tagId: "yR8iLzdBdylFkSzg1k4K"
| |
| --- tagName: "History"
| |
| --- questionId: "LongQuestionIdOne"
| |
| --- //Other tag properties
|
--- tagIdTwo (document)
|
--- tagId: "tUjKPoq2dylFkSzg9cFg"
|
--- tagName: "Geography"
|
--- questionId: "LongQuestionIdTwo"
|
--- //Other tag properties
Las diferencias entre estos dos enfoques son:
- Si desea consultar la base de datos para obtener todos
tags
de una pregunta en particular, usar el primer esquema es muy fácil porque solo unCollectionReference
es necesario (preguntas -> questionId -> etiquetas). Para lograr lo mismo utilizando el segundo esquema, en lugar de unCollectionReference
aQuery
es necesario, lo que significa que debe consultar todo eltags
colección para obtener solo las etiquetas que corresponden a una sola pregunta. - Usando el primer esquema todo está más organizado. Además de eso, en Firestore Profundidad máxima de subcolecciones: 100. Así que puedes aprovechar eso.
- Como también @RenaudTarnec mencionó en su comentario, las consultas en Cloud Firestore son superficiales, solo obtienen documentos de la colección contra la que se ejecuta la consulta. No hay forma de obtener documentos de una colección de nivel superior y otras colecciones o subcolecciones en una sola consulta. Firestore no admite consultas en diferentes colecciones a la vez. Una sola consulta solo puede usar propiedades de documentos en una sola colección. Por lo tanto, no hay forma de que pueda obtener todas las etiquetas de todas las preguntas utilizando el primer esquema.
Esta técnica se llama aplanar la base de datos y es una práctica bastante común cuando se trata de Firebase. Así que usa esta técnica solo si es necesario. Entonces, en su caso, si solo necesita mostrar las etiquetas de una sola pregunta, use el primer esquema. Si desea mostrar de alguna manera todas las etiquetas de todas las preguntas, se recomienda el segundo esquema.
¿Está ahí únicamente para que pueda expandirse si su documento se acerca al límite de 1 MB?
Si tiene una subcolección de objetos dentro de un documento, tenga en cuenta que el tamaño de la subcolección no cuenta en ese límite de 1 MiB. Solo se cuentan los datos que se almacenan en las propiedades del documento.
Editar 01 de octubre de 2019:
Según el comentario de @ShahoodulHassan:
Entonces, ¿no hay forma de que pueda obtener todas las etiquetas de todas las preguntas usando el primer esquema?
En realidad, ahora que hay, podemos obtener todas las etiquetas de todas las preguntas con el uso de la consulta de grupo de colección de Firestore. Una cosa a tener en cuenta es que todas las subcolecciones deben tener el mismo nombre, por ejemplo tags
.