2009-11-13 24 views
7

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.Was ist der Unterschied zwischen einem Index und einem Fremdschlüssel?

Können Sie erklären, was ein Index in diesem Szenario wäre, und wie unterscheidet es sich von einem Fremdschlüssel und wie die Auswirkungen der Datenbank-Design?

Antwort

12

ist ein Index für eine Tabelle eine Datenstruktur, die den wahlfreien Zugriff auf die Zeilen schnell und effizient ermöglicht. 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 Verweisbeschränkung zwischen den beiden Tabellen bildet.

4

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 möchten 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. Ausländischen Schlüssel, ist eine Möglichkeit, um sicherzustellen, dass Sie keine ungültigen Zeiger zwischen den Zeilen in Ihren Tabellen haben (in Ihrem Fall von der Beziehungstabelle zu Posts und Tags)

+0

Fremdschlüssel erzwingen keine NOT NULL-Regel. Ein Fremdschlüssel erzwingt eine Einschränkung für die Werte einer Spalte. – jabbie

+0

Er spricht nicht davon, einen NOT NULL-Wert zu erzwingen, er spricht davon, sicherzustellen, dass ich keine Id in der Child-Tabelle habe, die in der Elterntabelle nicht existiert. –

+0

Genau. Danke, Gabriel, für die Erklärung. – Dmitry

1

Fremdschlüssel in MySQL verwenden zu können, müssen Sie Indizes für beide Tabellen erstellen. Wenn Sie beispielsweise das Feld a_id in der Tabelle b auf das Feld id in der Tabelle a verweisen möchten, müssen Sie Indizes für die beiden Werte a.id und b.a_id erstellen, bevor Sie die Referenz erstellen können.

Update: hier können Sie mehr darüber lesen: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

+0

Der von Ihnen angegebene Link gilt nur für InnoDB-Datenbanken in MySQL. Ein besserer Link kann unter "http://dev.mysql.com/doc/refman/5.1/en/example-foreign-keys.html" gefunden werden. –

+0

Ich denke, dass MySQL automatisch Indizes für Primärschlüssel und referenzierende Spalten erstellt – Dmitry

2

Sie ein sehr häufiges Datenbank-Konstrukt beschreiben; 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 über welche Datenbankindizes sind: Index (database)

3

Ein Index als ein schnell nachzuschlagen für Daten in der Tabelle hinzugefügt wird. Ein Index kann Einschränkungen haben, da 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, die 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.

+0

Constraint (insbesondere UNIQUE) ist im Grunde eine Eigenschaft einer Spalte, kein Index – Dmitry

3

Frage: 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?

Ihre Fremdschlüssel in diesem Fall sind die beiden Spalten in Ihrer Posts_Tags Tabelle. 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-> PostID muss ein Wert in posts- enthalten sein> postID

Posts_Tags-> TagID muss ein Wert in Tags- enthalten sein> TagID

Denken Sie an einen Index als eine Spalte, die war erhöhte Geschwindigkeit und Effizienz für die Abfrage/Suche von Werten auf Kosten der größeren Datenbankgröße. Im Allgemeinen sind Primärschlüssel Indizes und andere Spalten, die Abfrage/Suche auf Ihrer Website erfordern, in Ihrem Fall wahrscheinlich der Name eines Beitrags (Posts> PostName)

In Ihrem Fall werden Indizes wenig Einfluss auf Ihre haben Design (sie sind schön für Geschwindigkeit und Effizienz), aber Ihre Fremdschlüssel sind sehr wichtig, um Datenkorruption zu vermeiden (mit Werten in ihnen, die nicht mit einem Post und/oder Tag übereinstimmen).

Verwandte Themen