Estoy mirando el diseño de esquema de base de datos de múltiples inquilinos para un concepto de SaaS. Será ASP.NET MVC -> EF, pero eso no es tan importante.Diseño de base de datos de Entity Framework y multi-tenancy
A continuación puede ver un esquema de base de datos de ejemplo (el Inquilino es la Compañía). El CompanyId se replica en todo el esquema y la clave principal se ha colocado tanto en la clave natural como en el ID del inquilino.
conecta este esquema en el marco de la entidad da los siguientes errores cuando agrego las tablas en el archivo de modelo de entidad (Model1.edmx):
- La relación 'FK_Order_Customer' utiliza el conjunto de claves externas '{CustomerId, CompanyId}' que están parcialmente contenidos en el conjunto de claves principales '{OrderId, CompanyId}' de la tabla 'Pedido'. El conjunto de claves externas debe estar completamente contenido en el conjunto de claves primarias, o completamente no incluido en el conjunto de claves primarias que se asignarán a un modelo.
- La relación 'FK_OrderLine_Customer' usa el conjunto de claves externas '{CustomerId, CompanyId}' que están parcialmente contenidas en el conjunto de claves principales '{OrderLineId, CompanyId}' de la tabla 'OrderLine'. El conjunto de claves externas debe estar completamente contenido en el conjunto de claves primarias, o completamente no incluido en el conjunto de claves primarias que se asignarán a un modelo.
- La relación 'FK_OrderLine_Order' utiliza el conjunto de claves foráneas '{OrderId, CompanyId}' que están parcialmente contenidas en el conjunto de claves primarias '{OrderLineId, CompanyId}' de la tabla 'OrderLine'. El conjunto de claves externas debe estar completamente contenido en el conjunto de claves primarias, o completamente no incluido en el conjunto de claves primarias que se asignarán a un modelo.
- La relación 'FK_Order_Customer' usa el conjunto de claves externas '{CustomerId, CompanyId}' que están parcialmente contenidas en el conjunto de claves primarias '{OrderId, CompanyId}' de la tabla 'Orden'. El conjunto de claves externas debe estar completamente contenido en el conjunto de claves primarias, o completamente no incluido en el conjunto de claves primarias que se asignarán a un modelo.
- La relación 'FK_OrderLine_Customer' usa el conjunto de claves externas '{CustomerId, CompanyId}' que están parcialmente contenidas en el conjunto de claves principales '{OrderLineId, CompanyId}' de la tabla 'OrderLine'. El conjunto de claves externas debe estar completamente contenido en el conjunto de claves primarias, o completamente no incluido en el conjunto de claves primarias que se asignarán a un modelo.
- La relación 'FK_OrderLine_Order' utiliza el conjunto de claves foráneas '{OrderId, CompanyId}' que están parcialmente contenidas en el conjunto de claves primarias '{OrderLineId, CompanyId}' de la tabla 'OrderLine'. El conjunto de claves externas debe estar completamente contenido en el conjunto de claves primarias, o completamente no incluido en el conjunto de claves primarias que se asignarán a un modelo.
- La relación 'FK_OrderLine_Product' utiliza el conjunto de claves foráneas '{ProductId, CompanyId}' que están parcialmente contenidas en el conjunto de claves principales '{OrderLineId, CompanyId}' de la tabla 'OrderLine'. El conjunto de claves externas debe estar completamente contenido en el conjunto de claves primarias, o completamente no incluido en el conjunto de claves primarias que se asignarán a un modelo.
La pregunta es en dos partes:
- es mi diseño de la base de datos incorrectos? ¿Debería abstenerme de estas claves primarias compuestas? Estoy cuestionando mi cordura con respecto al diseño de esquema fundamental (síndrome de cerebro agotado). Por favor, siéntase libre de sugerir el esquema 'idealizado'.
- Alternativamente, si el diseño de la base de datos es correcto, entonces ¿EF no puede hacer coincidir las claves porque percibe estas claves foráneas como posibles relaciones erróneas 1: 1 (incorrectamente)? En ese caso, ¿se trata de un error de EF y cómo puedo solucionarlo?
Multi-tenancy database schema http://i46.tinypic.com/23si52u.png
Si elimino las claves primarias compuestas y solo uso las teclas naturales (IdProducto, ID de pedido, Id. De cliente, Id. De línea de pedido), el error EF desaparece. Sin embargo, no estoy seguro de si eso es simplemente meter la basura debajo de la alfombra. – Junto
Una clave principal debe cumplir dos requisitos. Primero, debe ser único. Segundo, para la normalización, todos los elementos no clave deben ser completamente dependientes de la clave primaria. Algunas de sus claves compuestas rompen la normalización bastante mal, porque parece que un componente de su clave compuesta depende de la otra parte de la clave compuesta. Es un riesgo importante con las teclas compuestas. Entonces, para responder a su inquietud, ¡no * no * simplemente está metiendo basura debajo de la alfombra! –