Supongamos que tengo las siguientes tablas:SQL: La normalización de la base de datos, manteniendo las restricciones
____________________ ____________________
| Organisms | | Species |
|--------------------| |--------------------|
|OrganismId (int, PK)| |SpeciesId (int, PK) |
|SpeciesId (int, FK) |∞---------1|Name (varchar) |
|Name (varchar) | |____________________|
|____________________| 1
1 |
| |
| |
∞ ∞
______________________ ____________________ _______________
| OrganismPropsValues | | SpeciesProps | | Props |
|----------------------| |--------------------| |---------------|
|OrganismId (int, FK) | |PropId (int,PK,FK) | ∞-----1|PropId (int,PK)|
|PropId (int, FK) | |SpeciesId(int,PK,FK)| |Name (varchar) |
|Value (varchar) | |____________________| |_______________|
|______________________| 1
∞ |
| |
-----------------------------------------------------------
Una explicación rápida de lo que estoy tratando de representar aquí: Supongamos que tenemos una lista de especies, tales como gato, perro , humanos, etc. También tenemos un conjunto de propiedades (Apoyos abreviados para que se ajusten más fácilmente en el diagrama) que se aplican a algunas especies, pero no necesariamente a todas; por ejemplo, puede ser la longitud de la cola (para especies con colas)), color de ojos (para aquellos con ojos), etc.
SpeciesProps es una tabla de engarce que define qué propiedades se aplican a qué especie-- así que aquí Tiene {Human, Eye Color}, {Dog, Eye Color}, {Cat, Eye Color}, {Dog, Tail Length}, {Cat, Tail Length}. No tenemos {Human, Tail Length} porque la longitud de cola obviamente no es una propiedad válida para aplicar a un ser humano.
La tabla de Organismos contiene "implementaciones" reales de la especie-- Así que aquí podríamos tener {Humanos, Bob}, {Perro, Rufus}, y {Gato, Felix}.
Aquí está mi problema: en la tabla OrganismPropsValues, quiero almacenar los 'valores' de las propiedades para cada organismo; por ejemplo, para Bob quiero almacenar {Bob, Eye Color, Blue}. Para Rufus, me gustaría almacenar {Rufus, Eye Color, Brown} y {Rufus, Tail Length, 20} (similar para Felix). Mi problema, sin embargo, es que en el esquema que he detallado, es perfectamente posible almacenar {Bob, Tail Length, 10}, aunque la tupla {Human, Tail Length} no exista en SpeciesProps. ¿Cómo puedo modificar este esquema para poder aplicar las restricciones definidas en SpeciesProps en OrganismPropsValues, manteniendo una normalización adecuada?
Dependiendo de la base de datos (por ejemplo Oracle) solo crearía algunos procedimientos almacenados para INSERT/UPDATE/DELETE e implementaría cualquier restricción compleja allí ... – Yahia
@Yahia gracias por la sugerencia, pero si hay una forma para hacer esto sin introducir procedimientos, activadores, etc. Preferiría eso. Esto es MS-SQL (2008). – Andrew
Eso me hizo doler la cabeza.Esto será horrible de consultar (¡piense cuántas combinaciones se necesitarán para obtener todos los datos sobre un humano!) Y es un diseño tan pobre que no sé por dónde empezar. Las bases de datos no son objetos y no deberían diseñarse como objetos. Las tablas EAV son una solución extremadamente pobre. Contrate a un diseñador de base de datos real. – HLGEM