Ich möchte eine Datenbank mit 3 Tabellen erstellen. Eine für Posts und eine für Tags und eine, die Posts mit Tags verknüpft, wobei post_id und tag_id als Fremdschlüsselreferenzen fungieren.
Können Sie erklären, was ein Index in diesem Szenario wäre und wie er sich von einem Fremdschlüssel unterscheidet und wie sich dies auf mein Datenbankdesign auswirkt?
Ein Index für eine Tabelle ist eine Datenstruktur, die den wahlfreien Zugriff auf die Zeilen schnell und effizient macht. Es hilft auch, die interne Organisation einer Tabelle zu optimieren.
Ein Fremdschlüssel ist einfach ein Zeiger auf eine entsprechende Spalte in einer anderen Tabelle, die eine referenzielle Einschränkung zwischen den beiden Tabellen bildet.
Sie haben Fremdschlüssel in der dritten Tabelle. Indizes sind nicht notwendig, Sie benötigen sie, wenn Sie viele Daten haben, wo Sie etwas schnell anhand von Id finden möchten. Vielleicht wollen Sie einen Index für den Primärschlüssel der Beiträge, aber DBMS wird ihn wahrscheinlich automatisch erstellen.
Index ist eine redundante Datenstruktur, die einige Abfragen beschleunigt. Mit dem Fremdschlüssel können Sie praktisch sicherstellen, dass zwischen den Zeilen in Ihren Tabellen (in Ihrem Fall von der Beziehungstabelle zu Posts und Tags) keine ungültigen Zeiger vorhanden sind.
Ein Index wird hinzugefügt, um schnell nach Daten in der Tabelle zu suchen. Ein Index kann Einschränkungen haben, indem die Spalte oder die Spalten, die für den Index verwendet werden, möglicherweise eindeutig sein müssen (eindeutig: nur eine Zeile in der Datenbank wird für diesen Index zurückgegeben oder nicht eindeutig: mehrere Zeilen können zurückgegeben werden) . Der Primärschlüssel für die Tabelle ist ein eindeutiger Index und hat normalerweise nur eine Spalte.
Ein Fremdschlüssel ist ein Wert in einer Tabelle, der auf einen eindeutigen Index in einer anderen Tabelle verweist. Es wird verwendet, um Tabellen miteinander in Beziehung zu setzen. Beispielsweise kann eine untergeordnete Tabelle die eine übergeordnete Zeile über ihre Spalte nachschlagen, die ein eindeutiger Index in der übergeordneten Tabelle ist.
Frage : Können Sie erklären, was ein Index in diesem Szenario ist und wie er sich von einem Fremdschlüssel unterscheidet und wie sich dies auf mein Datenbankdesign auswirkt?
Ihre Fremdschlüssel sind in diesem Fall die zwei Spalten in Ihrer Tabelle Posts_Tags. Mit einem Fremdschlüssel muss jede Fremdschlüsselspalte einen Wert aus der Haupttabelle enthalten, auf die sie verweist. In diesem Fall die Tabellen Posts und Tags.
Posts_Tags- & gt; PostID muss ein Wert sein, der in Posts & gt; PostID
enthalten istPosts_Tags- & gt; TagID muss ein Wert sein, der in Tags- & gt; TagID
enthalten istStellen Sie sich einen Index als eine Spalte vor, der eine höhere Geschwindigkeit und Effizienz beim Abfragen / Suchen von Werten zugewiesen wurde, und zwar auf Kosten einer größeren Datenbankgröße. Im Allgemeinen sind Primärschlüssel Indizes und andere Spalten, die Abfragen / Suchen auf Ihrer Website erfordern, in Ihrem Fall wahrscheinlich der Name eines Posts (Post- & gt; PostName)
In Ihrem Fall haben Indizes wenig Einfluss auf Ihr Design (sie sind für Geschwindigkeit und Effizienz sehr nützlich), aber Ihre Fremdschlüssel sind sehr wichtig, um Datenkorruption zu vermeiden (mit Werten, die keinem Post entsprechen) und / oder Tag).
Sie beschreiben ein sehr häufiges Datenbank-Konstrukt; Es wird eine "Viele-zu-Viele-Beziehung" genannt.
Indizes sollten dieses Schema überhaupt nicht beeinflussen. In der Tat sollten sich Indizes nicht auf ein Schema auswirken. Indizes sind ein Kompromiss zwischen Zeit und Raum: Indizes geben an, dass Sie bereit sind, zusätzlichen Speicherplatz zu verwenden, im Gegenzug für schnellere Suchen in der Datenbank.
Wikipedia hat einen ausgezeichneten Artikel darüber, was Datenbankindizes sind: Index (Datenbank)
Um Fremdschlüssel in MySQL zu verwenden, müssen Sie Indizes für beide Tabellen erstellen. Wenn das Feld a_id
für die Tabelle b
beispielsweise das Feld id
für die Tabelle a
referenzieren soll, müssen Sie Indizes für a.id
und b.a_id
erstellen, bevor Sie die Referenz erstellen können .
Update: Hier können Sie mehr darüber lesen: Ссылка
Tags und Links mysql database primary-key foreign-keys