Consulta SQL para evitar el producto cartesiano

SQL Server es una base de datos versátil. Se adhiere a los principios de la gestión de bases de datos relacionales y, por lo tanto, es un RDBMS popular. Como los datos están disponibles en varias tablas, si la consulta SQL no se escribe de manera eficiente, en escenarios importantes, se produce un producto cartesiano. Eso lo veremos aquí.

En matemáticas generales, un producto cartesiano de dos conjuntos, a saber, M y N, se denota con M × N. Es el conjunto de todos los pares ordenados donde m está en M y n está en N.

Al llegar a SQL, si la tabla M tiene 10 filas de datos y si la tabla N tiene 20 filas de datos, la tabla de productos cartesianos tendrá 10 * 20 = 200 filas de datos. es decir, se suman todos los pares ordenados posibles del conjunto original de elementos. Podemos pensar que todas y cada una de las claves primarias de la primera tabla están mapeadas con una clave primaria de la segunda tabla. Por lo general, el producto cartesiano conduce a datos redundantes, y eso también para grandes conjuntos de datos, proporciona datos redundantes muy grandes. Por lo tanto, necesitamos escribir consultas SQL eficientes 

El producto cartesiano implica un gran número de operaciones computacionales que suelen ser redundantes. Por lo tanto, debemos evitar crear un producto cartesiano.

Cartesian Product

 

Proceso para evitar el producto cartesiano:

Paso 1: Tomemos una base de datos llamada ‘geeks for geeks’ y en eso tomemos 2 tablas, a saber, ‘Frutas’ y ‘Tamaños’ y tengamos el conjunto de datos anterior.

Consulta:

USE GEEKSFORGEEKS

CREATE TABLE [dbo].[FRUITS] (
    [fruitName] VARCHAR (20) NULL
);

INSERT INTO FRUITS VALUES('Apples');
INSERT INTO FRUITS VALUES('Mangoes');

SELECT * FROM FRUITS;

Producción:

 

Consulta:

CREATE TABLE [dbo].[SIZES] (
    [sizeName] VARCHAR (20) NULL
);
INSERT INTO SIZES VALUES('Small');
INSERT INTO SIZES VALUES('Medium');
INSERT INTO SIZES VALUES('Big');
SELECT * FROM SIZES;

Producción:

 

Paso 2: ahora, si solo combinamos dos tablas para obtener ambas columnas, podemos escribir la consulta como:

Consulta:

SELECT A.*, B.* FROM FRUITS A,SIZES B;

 

Paso 3: ahora, si se trata de una tabla grande, la salida resultante será muy grande y la mayoría de los datos son redundantes. Por lo tanto, debemos evitar eso. Se puede hacer haciendo la condición ‘JOIN’. En realidad, ahora ambas tablas no tienen una columna de conexión común, por lo tanto, debemos introducir una columna de conexión común.

Introduzcamos ‘fruidId’ para que tenga un valor único en la tabla ‘Frutas’ y el mismo ‘frutaId’ que la clave externa en la tabla ‘Tamaños’. Después de aplicar los valores:

Consulta:

ALTER TABLE FRUITS ADD FRUITID INT NULL;
-- SET THE VALUE 1 TO APPLES AND 2 TO MANGOES
SELECT * from FRUITS;

Producción:

 

Consulta:

ALTER TABLE SIZES ADD FRUITID INT NULL;
--LET US APPLY VALUES OF FRUITID TO 1 FOR SMALL, 2 FOR MEDIUM,1 FOR BIG
SELECT * from SIZES;

Producción:

 

Paso 4: como tenemos una columna de conexión común, podemos unir ambas tablas fácilmente con esa columna de conexión:

Consulta:

SELECT A.fruitName, B.sizeName FROM FRUITS A,SIZES B
WHERE A.FRUITID = B.FRUITID;
--Here we need to join fruitid in both the tables
--In this way, we can avoid cartesian product 
--As in Sizes table, fruitid is having 1 and 2 only,
-- we need to get apples and mangoes only
--that too apples will be having small and big sizes and 
-- mangoes will be having medium sizes.
--We can achieve that with this query

Producción:

 

Nota:

  • Tenemos que escribir las consultas. con cuidado.
  • Se utilizarán para unir dos tablas que tengan un nombre de columna con los mismos tipos de datos. 
  • Especialmente siempre es bueno mantener la relación entre la clave principal y la clave externa entre las tablas. Eso ayudará a sincronizar los resultados fácilmente. En estos escenarios, la mayor parte de la clave principal estará disponible en la primera tabla con un nombre de columna y el mismo nombre de columna se usa en la segunda tabla como clave externa.
  • Las uniones significativas son buenas y siempre unen y evitan los productos cartesianos. Se puede lograr manteniendo la relación de clave principal y externa o manteniendo el nombre de columna común, podemos crear uniones.
  • Las condiciones de unión deben darse en la cláusula ‘WHERE’ y en el caso de las operaciones ‘Group By’, debe aplicarse en la cláusula ‘Having’.

Conclusión:

Los datos de productos cartesianos son muy redundantes, especialmente cuando trabajamos con grandes conjuntos de datos y se pueden corregir mediante uniones válidas. Esa combinación interna también (que se cubre en el ejemplo anterior) dará un resultado exacto, es decir, solo se recuperarán los valores coincidentes en ambas o más tablas. Además, tenemos la combinación externa izquierda y la combinación externa derecha, pero todas deben usarse cuando sea necesario; de lo contrario, la combinación interna es la más eficiente para evitar el producto cartesiano.

Publicación traducida automáticamente

Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *