DocumentDB SQL – adjuntos

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 uniones entre tablas es muy importante al diseñar esquemas normalizados. Debido a que DocumentDB opera en un modelo de datos desnormalizado para documentos sin esquema, JOIN en DocumentDB SQL es el equivalente lógico de «autounión».

Veamos tres documentos como en los ejemplos anteriores.

Lo que sigue 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 que sigue 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 que sigue es el WakefieldFamilia 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 
} 

Tomemos un ejemplo para entender cómo funciona la cláusula JOIN.

Conexión SQL

A continuación se muestra una consulta que concatenará el subdocumento raíz y 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 conexión ocurre entre la raíz del documento y la subraíz secundaria, lo que crea un producto cruzado entre los dos objetos JSON. A continuación se muestran 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 elementos secundarios, por lo que el conjunto de resultados también contiene un producto cruzado que crea un objeto independiente para cada elemento secundario.

  • El tercer documento, AndersenFamily, contiene solo un hijo, por lo tanto, solo un objeto corresponde a este documento.

Veamos el mismo ejemplo, sin embargo, esta vez también extraemos el nombre del niño para comprender mejor la cláusula JOIN.

Conexiones SQL

A continuación se muestra una consulta que vinculará el subdocumento raíz a los elementos secundarios.

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, da el siguiente resultado.

[ 
   { 
      "familyName": "WakefieldFamily", 
      "childGivenName": "Jesse" 
   },
	
   { 
      "familyName": "WakefieldFamily", 
      "childGivenName": "Lisa" 
   },
	
   { 
      "familyName": "SmithFamily", 
      "childGivenName": "Michelle" 
   },
	
   { 
      "familyName": "SmithFamily", 
      "childGivenName": "John" 
   },
	
   { 
      "familyName": "AndersenFamily", 
      "childFirstName": "Henriette Thaulow" 
   } 
] 

🚫