Einige Projekte wurden mit EF gestartet, aber ich hatte einige Fragen zu Verknüpfungstabellen und Schlüsseln usw. Nehmen wir an, ich habe eine Tabelle mit Anwendungen und Berechtigungen. Anwendungen haben viele Berechtigungen und jede Berechtigung kann zu vielen Anwendungen gehören (viele-zu-viele).
Jetzt sind die Anwendungs- und Berechtigungstabellen einfach:
Applications
--------------
PK ApplicationID
Name
Permissions
--------------
PK PermissionID
Name
Aber wie geht das am besten am Join-Tisch? Ich habe diese zwei Möglichkeiten:
ApplicationPermissions
-----------------------
PK ApplicationPermissionID
CU ApplicationID
CU PermissionID
ODER
ApplicationPermissions
-----------------------
CPK ApplicationID
CPK PermissionID
PK = Primary Key
CPK = Composite Primary Key
CU = Composite Unique Index
Wurdest du jemals verbrannt, als du es auf die eine oder andere Weise getan hast? ist es streng bevorzugt? Mir ist der Gedanke gekommen, dass viele der "Unterschiede" durch mein Repository-Muster abstrahiert werden (zum Beispiel würde ich fast nie ein gesamtes Berechtigungsobjekt erstellen und es einer Anwendung hinzufügen, sondern es anhand der ID oder des eindeutigen Namens oder irgendwas), aber ich schätze, ich suche nach Horrorgeschichten, so oder so.
quelle
Im Laufe der Jahre habe ich mir angewöhnt, jeder Tabelle "TableName" ausnahmslos einen automatisch generierten Primärschlüssel "TableNameID" zuzuweisen, auch nicht für Junction-Tabellen. Ich kann sagen, ich habe es nie bereut, weil es beim Erstellen von generischem Code, der etwas für "alle Tabellen" oder "einige Tabellen" oder für "viele Zeilen mehrerer verschiedener Tabellen" tut, vieles einfacher macht.
Wenn Sie beispielsweise aufgefordert werden, einige Zeilen verschiedener Tabellen (oder Verweise auf diese) in einer Datei oder im Speicher zu speichern, beispielsweise zu Protokollierungszwecken, ist es sehr praktisch, wenn Sie im Voraus wissen, dass Sie nur genau eine speichern müssen Tabellenname & genau eine Integer-ID, und Sie müssen sich nicht mit "Sonderfällen" auseinandersetzen.
Wenn Sie mit kombinierten PKs beginnen, werden Sie wahrscheinlich einige Male später auf die Notwendigkeit von kombinierten Fremdschlüsseln stoßen (da Sie möglicherweise an einem Punkt angelangt sind, an dem Sie Ihrer
ApplicationPermissions
Tabelle eine FK-Referenz hinzufügen möchten ). Dann kann die nächste Anforderung sein, dass diese FK in Verbindung mit anderen Attributen oder Fremdschlüsseln eindeutig ist - was insgesamt zu einer erhöhten Komplexität führt. Natürlich nichts, was für die meisten modernen DB-Systeme nicht zu handhaben ist, aber eine einheitliche Lösung erleichtert Programmierern oft das Leben.Und schließlich
SELECT ... FROM TABLE WHERE TableNameID IN (id1,id2,...)
funktioniert eine Anweisung wie mit einer einzelnen Spalte als Primärschlüssel gut, aber ich habe noch nie einen SQL-Dialekt gesehen, mit dem Sie dies mit kombinierten Schlüsseln tun können. Wenn Sie vorher wissen, dass Sie eine solche Abfrage nie benötigen, ist dies in Ordnung. Seien Sie jedoch nicht überrascht, wenn Sie morgen eine Anforderung erhalten, die mit dieser Art von SQL am einfachsten zu lösen ist.Wenn Sie erwarten, dass Ihre
ApplicationPermissions
Tabelle mehrere hundert Millionen Zeilen enthält, sollten Sie natürlich in Betracht ziehen, so etwas wie a zu vermeidenApplicationPermissionsID
.quelle
Obwohl Mikes Antwort gut ist, habe ich hier die Gründe, warum ich ein separates ID-Feld hinzufügen würde oder nicht.
Verwenden Sie ein separates ID-Feld für die Junction- / Join-Tabelle, wenn es andere Felder als die ID enthält . Dies führt dazu, dass es sich um eine erstklassige Entität handelt.
Ziehen Sie die Verwendung eines separaten ID-Felds in Betracht, wenn APIs oder eine vorhandene Logik dazu neigen, einzelne Felder zum Abrufen / Bearbeiten von Entitäten zu verwenden. Dies kann anderen helfen, Ihren Code im Rahmen eines größeren Projekts zu verfolgen.
Verwenden Sie es nicht, wenn es keinen spezifischen Nutzen gibt (KISS). EF weiß, wie man mit dieser Art von Tabelle umgeht, und eine zusammengesetzte eindeutige Einschränkung kann manchmal übersehen werden, wenn andere Leute versuchen, diese Art von Beziehung zu verstehen. Außerdem versuche ich beim Normalisieren, den kleinstmöglichen Schlüssel zu verwenden, der das Tupel eindeutig definiert . In Ihrem zweiten Beispiel verfügen Sie effektiv über zwei separate Kandidatenprimärschlüssel.
quelle
Denken Sie daran, einen Index und einen Fremdschlüssel für beide
PersonId
und zu erstellenAddressId
.Egal, was andere für "besser" oder "Sie sollten" halten, dies ist die einfachste und einfachste Möglichkeit, die Datenbank ordnungsgemäß funktionieren zu lassen.
quelle
PersonAddress
Zeilen mit identischenPersonId
undAddressId
Werten zulässt .