Estos datos están normalizados
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }
Esta tabla no es (mala idea)
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, building_id, floor_id, data }
bed {id, building_id, floor_id, room_id, data }
- En la primera tabla (buena) no tiene datos duplicados innecesarios.
- Las inserciones en la primera tabla serán mucho más rápidas.
- Las primeras tablas caben más fácilmente en la memoria, lo que acelera las consultas.
- InnoDB está optimizado con el modelo A en mente, no con el modelo B.
- La última tabla (mala) tiene datos duplicados, si que se desincroniza, tendrás un lío. DB A no puede ser mucho más difícil de sincronizar, porque los datos solo se enumeran una vez.
- Si quiero combinar datos desde el edificio, el piso, la habitación y la cama, necesitaré combinar las cuatro mesas en el modelo A y el modelo B, ¿cómo estás ahorrando tiempo aquí?
- InnoDB almacena datos indexados en su propio archivo, si
select
solo índices , las propias tablas nunca ser accedido. Entonces, ¿por qué estás duplicando los índices? MySQL nunca necesitará leer la tabla principal de todos modos. - InnoDB almacena el PK en cada índice secundario , con un PK compuesto y, por lo tanto, largo, está ralentizando cada selección que usa un índice y aumentando el tamaño del archivo; sin ganancia alguna.
- ¿Tiene problemas graves de velocidad? Si no, ¿estás desnormalizando tus tablas?
- Ni siquiera piense en usar MyISAM, que sufre menos de estos problemas, no está optimizado para bases de datos de unión múltiple y no admite transacciones o integridad referencial y no es una buena opción para esta carga de trabajo.
- Cuando usa una clave compuesta, solo puede usar la parte más a la derecha de la clave, es decir, no puede usar
floor_id
en mesabed
aparte de usarid+building_id+floor_id
, Esto significa que es posible que deba usar mucho más espacio de teclas que el necesario en el Modelo A. O eso o necesita agregar un índice adicional (que arrastrará una copia completa del PK).
En resumen
Veo absolutamente cero beneficios y muchos inconvenientes en el Modelo B, ¡nunca lo use!