Diese Frage wird gestellt, nachdem ein Kommentar in dieser Frage gelesen wurde:
Wenn Sie eine Viele-zu-Viele-Tabelle erstellen, sollten Sie einen zusammengesetzten Primärschlüssel für die beiden Fremdschlüsselspalten erstellen oder einen automatisch inkrementierten Ersatz-Primärschlüssel "ID" erstellen und einfach Indizes für Ihre beiden FK-Spalten (und möglicherweise) erstellen eine einzigartige Einschränkung)? Was sind die Auswirkungen auf die Leistung beim Einfügen neuer Datensätze / beim erneuten Indizieren?
Grundsätzlich ist dies:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
gegen dieses:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Der Kommentator sagt:
Wenn Sie die beiden IDs zur PK machen, wird die Tabelle in dieser Reihenfolge physisch auf der Festplatte sortiert. Wenn wir also (Teil1 / Gerät1), (Teil1 / Gerät2), (Teil2 / Gerät3) einfügen, muss die Datenbank (Teil 1 / Gerät3) die Tabelle auseinander brechen und die letzte zwischen den Einträgen 2 und 3 einfügen Bei vielen Datensätzen wird dies sehr problematisch, da bei jedem Hinzufügen Hunderte, Tausende oder Millionen von Datensätzen gemischt werden. Im Gegensatz dazu ermöglicht eine automatisch inkrementierende PK, dass die neuen Datensätze bis zum Ende angeheftet werden.
Der Grund, den ich frage, ist, dass ich immer geneigt war, den zusammengesetzten Primärschlüssel ohne Ersatz-Auto-Inkrement-Spalte zu erstellen, aber ich bin mir nicht sicher, ob der Ersatzschlüssel tatsächlich leistungsfähiger ist.
quelle
Antworten:
Bei einer einfachen zweispaltigen Viele-zu-Viele-Zuordnung sehe ich keinen wirklichen Vorteil darin, einen Ersatzschlüssel zu haben. Das Aktivieren eines Primärschlüssels
(col1,col2)
ist garantiert eindeutig (vorausgesetzt, Ihrecol1
und diecol2
Werte in den Tabellen, auf die verwiesen wird, sind eindeutig), und ein separater Index(col2,col1)
aktiviert die Fälle, in denen die entgegengesetzte Reihenfolge schneller ausgeführt wird. Der Ersatz ist Platzverschwendung.Sie benötigen keine Indizes für die einzelnen Spalten, da die Tabelle immer nur zum Zusammenfügen der beiden referenzierten Tabellen verwendet werden sollte.
Dieser Kommentar, auf den Sie sich in der Frage beziehen, ist meiner Meinung nach die verwendeten Elektronen nicht wert. Es hört sich so an, als ob der Autor der Meinung ist, dass die Tabelle in einem Array gespeichert ist und nicht in einer ausgeglichenen Mehrwegbaumstruktur mit extrem hoher Leistung.
Zunächst ist es nie notwendig , nur den Index zu speichern oder an der Tabelle zu sortieren. Und der Index wird nicht nacheinander gespeichert , sondern auf effiziente Weise, um schnell abgerufen werden zu können.
Darüber hinaus wird die überwiegende Mehrheit der Datenbanktabellen weitaus häufiger gelesen als geschrieben. Das macht alles, was Sie auf der Auswahlseite tun, weitaus relevanter als alles, was Sie auf der Einfügeseite tun.
quelle
insert
wird wichtig sein, wenn es tausende Male pro Stunde gemacht wird. Sie können es nicht einfach ignorieren, nur weil das Verhältnis voninsert
zuselect
<1 ist. In diesem Fall kümmert sich ein Kunde darum, wie viel Zeit es dauert, eine Bestellung aufzugeben.Für Verknüpfungstabellen wird kein Ersatzschlüssel benötigt.
Ein PK on (col1, col2) und ein weiterer eindeutiger Index on (col2, col1) sind alles, was Sie brauchen
Es sei denn, Sie verwenden ein ORM, das Ihr DB-Design nicht bewältigen kann und für Sie diktiert ...
Bearbeiten: Ich habe hier dasselbe geantwortet: SQL: Benötigen Sie einen automatisch inkrementellen Primärschlüssel für Many-Many-Tabellen?
quelle
(col2, col1)
ist nicht(col1, col2)
. Die PK von ist(col1, col2)
möglicherweise nicht für alle Abfragen geeignet und generiert Scans. Wenn Sie also umgekehrt sind, wird die Leistung verbessert, da Suchen möglich sind, bei denen col2 besser ist. Zum Beispiel FK-Validierung, wenn die Tabelle mit col2 gelöscht wurde. DerEin inkrementeller Primärschlüssel kann erforderlich sein, wenn auf die Tabelle verwiesen wird. Möglicherweise enthält die Viele-zu-Viele-Tabelle Details, die mit dem inkrementellen Primärschlüssel aus einer anderen Tabelle abgerufen werden mussten.
beispielsweise
Mit PartDevice.ID als FK ist es einfach, die 'Sonstigen Details' abzurufen. Daher ist die Verwendung eines inkrementellen Primärschlüssels erforderlich.
quelle
Der kürzeste und direkteste Weg, wie ich Ihre Frage beantworten kann, besteht darin, zu sagen, dass die Leistung beeinträchtigt wird, wenn die beiden von Ihnen verknüpften Tabellen keine sequentiellen Primärschlüssel haben. Wie Sie angegeben / zitiert haben, wird der Index für die Verknüpfungstabelle entweder fragmentiert oder das DBMS arbeitet härter, um Datensätze einzufügen, wenn die Verknüpfungstabelle keinen eigenen sequentiellen Primärschlüssel hat. Dies ist der Grund, warum die meisten Leute einen sequentiell inkrementierenden Primärschlüssel in Verknüpfungstabellen einfügen.
quelle
Wenn also die EINZIGE Aufgabe darin besteht, die beiden Tabellen zu verknüpfen, ist die zweispaltige PK die beste PK.
Wenn es jedoch anderen Zwecken dient, fügen Sie einen weiteren NDX als PK mit einem Fremdschlüssel und einem zweiten eindeutigen Index hinzu.
Index oder PK ist der beste Weg, um sicherzustellen, dass keine Duplikate vorhanden sind. Mit PK können Tools wie Microsoft Management Studio einen Teil der Arbeit (Erstellen von Ansichten) für Sie erledigen
quelle