Sé que esto es ultra básico, pero es una suposición que siempre he defendido y me gustaría validar que es cierta (en general, con los detalles específicos de varias implementaciones)Pregunta sobre cómo se almacenan los datos de claves externas en SQL
Digamos que tengo una tabla que tiene una columna de texto "Fruta". En esa columna, solo aparece uno de los cuatro valores: Pera, Manzana, Plátano y Fresa. Tengo un millón de filas.
En lugar de repetir esos datos (en promedio) un cuarto de millón de veces cada uno, si los extraigo en otra tabla que tiene una columna Fruit y solo esas cuatro filas, y luego hago de la columna original una clave externa, ¿ahorra espacio?
Supongo que los cuatro nombres de fruta se almacenan solo una vez, y que el millón de filas ahora tienen punteros o índices o algún tipo de referencia en la segunda tabla.
Si mis valores de fila son más largos que los nombres de fruta corta, supongo que el ahorro/optimización es aún mayor.
Piense en una variable de tipo de referencia 3GL como C# .NET: su valor sale en una ubicación en la memoria pero puede tener muchas variables de referencia que son meramente punteros enteros (o lo que sea) a esa ubicación. El mismo principio se puede aplicar a DBMS: lógicamente ambas tablas en un FK almacenan la fruta como texto pero debajo de las cubiertas el texto se almacena una sola vez y cada tabla almacena físicamente solo un entero (o lo que sea) un puntero al mismo valor. ¿MySQL hace esto? Creo que eso es a lo que se dirige la persona que pregunta. – onedaywhen
No compararía las prácticas de almacenamiento de datos de mysql con un lenguaje de programación. Tendría sentido almacenar solo una copia, pero las claves externas no son referencias. son solo un campo como cualquier otro que contiene información que coincide con el campo/datos equivalentes en otra tabla. Después de todo, dejar caer una llave foránea en una mesa grande es casi instantáneo. Si fuera una referencia, el DBMS tendría que copiar sobre los datos reales ahora que la referencia se ha ido. –