Ich bin auf Multi-Tenancy-Datenbank-Schema-Design für ein SaaS-Konzept. Es wird ASP.NET MVC -> EF sein, aber das ist nicht so wichtig.Entity Framework und Multi-Tenancy-Datenbank-Design
Unten sehen Sie ein Beispiel für ein Datenbankschema (der Mieter ist das Unternehmen). Die CompanyId wird im gesamten Schema repliziert, und der Primärschlüssel wurde sowohl auf den natürlichen Schlüssel als auch auf die Tenant-ID gesetzt.
dieses Schema in das Entity Framework Anstecken gibt die folgenden Fehler, wenn ich die Tabellen in das Entity Model-Datei (Model1.edmx) hinzufügen:
- Die Beziehung ‚FK_Order_Customer‘ verwendet den Satz von Fremdschlüssel '{CustomerId, CompanyId}', die teilweise in der Menge der Primärschlüssel '{OrderId, CompanyId}' der Tabelle 'Order' enthalten sind. Die Gruppe von Fremdschlüsseln muss vollständig in der Menge der Primärschlüssel enthalten sein oder nicht vollständig in der Menge der Primärschlüssel enthalten sein, die einem Modell zugeordnet werden sollen.
- Die Beziehung 'FK_OrderLine_Customer' verwendet die Menge der Fremdschlüssel '{CustomerId, CompanyId}', die teilweise im Satz der Primärschlüssel '{OrderLineId, CompanyId}' der Tabelle 'OrderLine' enthalten sind. Die Gruppe von Fremdschlüsseln muss vollständig in der Menge der Primärschlüssel enthalten sein oder nicht vollständig in der Menge der Primärschlüssel enthalten sein, die einem Modell zugeordnet werden sollen.
- Die Beziehung 'FK_OrderLine_Order' verwendet die Gruppe der Fremdschlüssel '{OrderId, CompanyId}', die teilweise in der Menge der Primärschlüssel '{OrderLineId, CompanyId}' der Tabelle 'OrderLine' enthalten sind. Die Menge der Fremdschlüssel muss vollständig in der Menge der Primärschlüssel enthalten sein oder nicht vollständig in der Menge der Primärschlüssel enthalten sein, die einem Modell zugeordnet werden sollen.
- Die Beziehung 'FK_Order_Customer' verwendet die Gruppe der Fremdschlüssel '{CustomerId, CompanyId}', die teilweise in der Menge der Primärschlüssel '{OrderId, CompanyId}' der Tabelle 'Order' enthalten sind. Die Menge der Fremdschlüssel muss vollständig in der Menge der Primärschlüssel enthalten sein oder nicht vollständig in der Menge der Primärschlüssel enthalten sein, die einem Modell zugeordnet werden sollen.
- Die Beziehung 'FK_OrderLine_Customer' verwendet die Menge der Fremdschlüssel '{CustomerId, CompanyId}', die teilweise im Satz der Primärschlüssel '{OrderLineId, CompanyId}' der Tabelle 'OrderLine' enthalten sind. Die Menge der Fremdschlüssel muss vollständig in der Menge der Primärschlüssel enthalten sein oder nicht vollständig in der Menge der Primärschlüssel enthalten sein, die einem Modell zugeordnet werden sollen.
- Die Beziehung 'FK_OrderLine_Order' verwendet die Gruppe der Fremdschlüssel '{OrderId, CompanyId}', die teilweise in der Menge der Primärschlüssel '{OrderLineId, CompanyId}' der Tabelle 'OrderLine' enthalten sind. Die Gruppe von Fremdschlüsseln muss vollständig in der Menge der Primärschlüssel enthalten sein oder nicht vollständig in der Menge der Primärschlüssel enthalten sein, die einem Modell zugeordnet werden sollen.
- Die Beziehung 'FK_OrderLine_Product' verwendet die Menge der Fremdschlüssel '{ProductId, CompanyId}', die teilweise in der Menge der Primärschlüssel '{OrderLineId, CompanyId}' der Tabelle 'OrderLine' enthalten sind. Die Menge der Fremdschlüssel muss vollständig in der Menge der Primärschlüssel enthalten sein oder nicht vollständig in der Menge der Primärschlüssel enthalten sein, die einem Modell zugeordnet werden sollen.
Die Frage ist in zwei Teilen:
- meine Datenbank-Design falsch sind? Sollte ich auf diese zusammengesetzten Primärschlüssel verzichten? Ich stelle meine Vernunft bezüglich des grundlegenden Schemadesigns (Frazzled Brain Syndrome) in Frage. Bitte zögern Sie nicht, das "idealisierte" Schema vorzuschlagen.
- Wenn das Datenbankdesign korrekt ist, kann EF dann die Schlüssel nicht zuordnen, da es diese Fremdschlüssel als potenziell falsch konfigurierte 1: 1-Beziehungen (falsch) wahrnimmt? In welchem Fall ist das ein EF-Bug und wie kann ich damit umgehen?
Multi-tenancy database schema http://i46.tinypic.com/23si52u.png
Wenn ich die zusammengesetzten Primärschlüssel entferne und einfach die natürlichen Schlüssel (ProductId, OrderId, CustomerId, OrderLineId) verwende, verschwindet der EF-Fehler. Ich bin mir jedoch nicht sicher, ob das nur den Mist unter den Teppich schaufelt! – Junto
Ein Primärschlüssel muss zwei Anforderungen erfüllen. Erstens muss es einzigartig sein. Zweitens müssen für die Normalisierung alle Nicht-Schlüsselelemente vollständig vom Primärschlüssel abhängig sein. Einige Ihrer zusammengesetzten Schlüssel brechen die Normalisierung ziemlich stark, da es so aussieht, als ob eine Komponente Ihres zusammengesetzten Schlüssels vom anderen Teil des zusammengesetzten Schlüssels abhängt. Es ist ein großes Risiko bei zusammengesetzten Schlüsseln. Also, um Ihre Bedenken zu beantworten, nein, es ist * nicht * nur Mist unter den Teppich schaufeln! –