Sto osservando la progettazione di schemi di database multi-tenancy per un concetto SaaS. Sarà ASP.NET MVC -> EF, ma non è così importante.Entity Framework e progettazione di database multi-tenancy
Di seguito è possibile vedere uno schema di database di esempio (il titolare è la società). CompanyId viene replicato in tutto lo schema e la chiave primaria è stata posizionata sia sulla chiave naturale, sia sull'ID tenant.
Inserendo questo schema in Entity Framework dà i seguenti errori quando aggiungo le tabelle nel file Entity Model (Model1.edmx):
- Il rapporto 'FK_Order_Customer' utilizza il set di chiavi esterne '{CustomerId, CompanyId}' che sono parzialmente contenuti nel set di chiavi primarie '{OrderId, CompanyId}' della tabella 'Ordine'. Il set di chiavi esterne deve essere completamente contenuto nel set di chiavi primarie, o completamente non contenuto nel set di chiavi primarie da mappare su un modello.
- La relazione 'FK_OrderLine_Customer' utilizza l'insieme di chiavi esterne '{CustomerId, CompanyId}' che sono parzialmente contenute nel set di chiavi primarie '{OrderLineId, CompanyId}' della tabella 'OrderLine'. Il set di chiavi esterne deve essere completamente contenuto nel set di chiavi primarie, o completamente non contenuto nel set di chiavi primarie da mappare su un modello.
- La relazione 'FK_OrderLine_Order' utilizza il set di chiavi esterne '{OrderId, CompanyId}' che sono parzialmente contenute nel set di chiavi primarie '{OrderLineId, CompanyId}' della tabella 'OrderLine'. Il set di chiavi esterne deve essere completamente contenuto nel set di chiavi primarie, o completamente non contenuti nella serie di chiavi primarie essere associato a un modello.
- Il rapporto 'FK_Order_Customer' utilizza il set di chiavi esterne '{CustomerId, CompanyID}' che sono parzialmente contenute nel set di chiavi primarie '{OrderId, CompanyID}' del 'ordine' tavolo. Il set di chiavi esterne deve essere completamente contenuto nel set di chiavi primarie, o completamente non contenuto nel set di chiavi primarie da mappare su un modello.
- La relazione 'FK_OrderLine_Customer' utilizza l'insieme di chiavi esterne '{CustomerId, CompanyId}' che sono parzialmente contenute nel set di chiavi primarie '{OrderLineId, CompanyId}' della tabella 'OrderLine'. Il set di chiavi esterne deve essere completamente contenuto nel set di chiavi primarie, o completamente non contenuti nella serie di chiavi primarie essere associato a un modello.
- La relazione 'FK_OrderLine_Order' utilizza il set di chiavi esterne '{OrderId, CompanyId}' che sono parzialmente contenute nel set di chiavi primarie '{OrderLineId, CompanyId}' della tabella 'OrderLine'. Il set di chiavi esterne deve essere completamente contenuto nel set di chiavi primarie, o completamente non contenuto nel set di chiavi primarie da mappare su un modello.
- La relazione 'FK_OrderLine_Product' utilizza il set di chiavi esterne '{ProductId, CompanyId}' che sono parzialmente contenute nel set di chiavi primarie '{OrderLineId, CompanyId}' della tabella 'OrderLine'. Il set di chiavi esterne deve essere completamente contenuto nel set di chiavi primarie, o completamente non contenuti nella serie di chiavi primarie essere associato a un modello.
La domanda è in due parti:
- È il mio progettazione di database non è corretto? Dovrei astenermi da queste chiavi primarie composte? Sto mettendo in discussione la mia sanità mentale per quanto riguarda il disegno dello schema fondamentale (sindrome del cervello frazzled). Non esitate a suggerire lo schema 'idealizzato'.
- In alternativa, se la struttura del database è corretta, EF non è in grado di far corrispondere le chiavi perché percepisce queste chiavi esterne come un potenziale rapporto errato 1: 1 (non corretto)? In tal caso, si tratta di un bug EF e come posso aggirarlo?
Multi-tenancy database schema http://i46.tinypic.com/23si52u.png
Se rimuovo le chiavi primarie composite e uso solo le chiavi naturali (ProductId, OrderId, CustomerId, OrderLineId), l'errore EF scompare. Tuttavia, non sono sicuro se questo è solo spalare la merda sotto il tappeto! – Junto
Una chiave primaria deve soddisfare due requisiti. Innanzitutto, deve essere unico. Secondo, per la normalizzazione, tutti gli elementi non chiave devono essere completamente dipendenti dalla chiave primaria. Alcuni dei tasti composti interrompono la normalizzazione in modo piuttosto grave, perché sembra che un componente della chiave composta dipenda dall'altra parte della chiave composta. È un grosso rischio con le chiavi composte. Quindi, per rispondere alla tua preoccupazione, no, non è * solo * spalare merda sotto il tappeto! –