DocumentDB SQL - Uniones
En las bases de datos relacionales, la cláusula Joins se utiliza para combinar registros de dos o más tablas en una base de datos, y la necesidad de unir tablas es muy importante al diseñar esquemas normalizados. Dado que DocumentDB se ocupa del modelo de datos desnormalizado de documentos sin esquema, JOIN en DocumentDB SQL es el equivalente lógico de un "selfjoin".
Consideremos los tres documentos como en los ejemplos anteriores.
Lo siguiente es el AndersenFamily documento.
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{ "firstName": "Thomas", "relationship": "father" },
{ "firstName": "Mary Kay", "relationship": "mother" }
],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [ { "givenName": "Fluffy", "type": "Rabbit" } ]
}
],
"location": { "state": "WA", "county": "King", "city": "Seattle" },
"isRegistered": true
}
Lo siguiente es el SmithFamily documento.
{
"id": "SmithFamily",
"parents": [
{ "familyName": "Smith", "givenName": "James" },
{ "familyName": "Curtis", "givenName": "Helen" }
],
"children": [
{
"givenName": "Michelle",
"gender": "female",
"grade": 1
},
{
"givenName": "John",
"gender": "male",
"grade": 7,
"pets": [
{ "givenName": "Tweetie", "type": "Bird" }
]
}
],
"location": {
"state": "NY",
"county": "Queens",
"city": "Forest Hills"
},
"isRegistered": true
}
Lo siguiente es el WakefieldFamily documento.
{
"id": "WakefieldFamily",
"parents": [
{ "familyName": "Wakefield", "givenName": "Robin" },
{ "familyName": "Miller", "givenName": "Ben" }
],
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"gender": "female",
"grade": 6,
"pets": [
{ "givenName": "Charlie Brown", "type": "Dog" },
{ "givenName": "Tiger", "type": "Cat" },
{ "givenName": "Princess", "type": "Cat" }
]
},
{
"familyName": "Miller",
"givenName": "Lisa",
"gender": "female",
"grade": 3,
"pets": [
{ "givenName": "Jake", "type": "Snake" }
]
}
],
"location": { "state": "NY", "county": "Manhattan", "city": "NY" },
"isRegistered": false
}
Echemos un vistazo a un ejemplo para entender cómo funciona la cláusula JOIN.
A continuación se muestra la consulta que unirá el subdocumento raíz al secundario.
SELECT f.id
FROM Families f
JOIN c IN f.children
Cuando se ejecuta la consulta anterior, producirá el siguiente resultado.
[
{
"id": "WakefieldFamily"
},
{
"id": "WakefieldFamily"
},
{
"id": "SmithFamily"
},
{
"id": "SmithFamily"
},
{
"id": "AndersenFamily"
}
]
En el ejemplo anterior, la unión se realiza entre la raíz del documento y la subraíz secundaria, lo que genera un producto cruzado entre dos objetos JSON. A continuación se presentan algunos puntos a tener en cuenta:
En la cláusula FROM, la cláusula JOIN es un iterador.
Los dos primeros documentos WakefieldFamily y SmithFamily contienen dos hijos, por lo que el conjunto de resultados también contiene el producto cruzado que produce un objeto separado para cada hijo.
El tercer documento AndersenFamily contiene solo un hijo, por lo tanto, solo hay un único objeto correspondiente a este documento.
Echemos un vistazo al mismo ejemplo, sin embargo, esta vez también recuperamos el nombre del niño para comprender mejor la cláusula JOIN.
A continuación se muestra la consulta que unirá el subdocumento raíz al secundario.
SELECT
f.id AS familyName,
c.givenName AS childGivenName,
c.firstName AS childFirstName
FROM Families f
JOIN c IN f.children
Cuando se ejecuta la consulta anterior, produce el siguiente resultado.
[
{
"familyName": "WakefieldFamily",
"childGivenName": "Jesse"
},
{
"familyName": "WakefieldFamily",
"childGivenName": "Lisa"
},
{
"familyName": "SmithFamily",
"childGivenName": "Michelle"
},
{
"familyName": "SmithFamily",
"childGivenName": "John"
},
{
"familyName": "AndersenFamily",
"childFirstName": "Henriette Thaulow"
}
]