2009-11-13 11 views
7

Voglio creare un database con 3 tabelle. Uno per i post e uno per i tag e uno che collega i post ai tag con post_id e tag_id che funzionano come riferimenti a chiavi esterne.Qual è la differenza tra un indice e una chiave esterna?

Puoi spiegare che cosa sarebbe un indice in questo scenario e in che modo si differenzia da una chiave esterna e in che modo ciò influisce sulla progettazione del mio database?

risposta

12

un indice su una tabella è una struttura dati che rende l'accesso casuale alle righe veloce ed efficiente. Aiuta a ottimizzare l'organizzazione interna di un tavolo.

Una chiave esterna è semplicemente un puntatore a una colonna corrispondente in un'altra tabella che forma un vincolo referenziale tra le due tabelle.

4

Avrai chiavi esterne nel terzo tavolo. Gli indici non sono necessari, ne hai bisogno se hai molti dati dove vuoi trovare qualcosa con Id velocemente. Forse vorrai un indice sulla chiave primaria del post, ma probabilmente il DBMS lo creerà automaticamente.

L'indice è una struttura di dati ridondante che accelera alcune query. Chiave esterna, per questioni pratiche, è un modo per assicurarsi che non ci siano indicatori non validi tra le righe nelle tabelle (nel tuo caso, dalla tabella delle relazioni a post e tag)

+0

Le chiavi esterne non applicano una regola NOT NULL. Una chiave esterna applica un vincolo ai valori di una colonna. – jabbie

+0

Non sta parlando di applicare un valore NOT NULL, sta parlando di assicurarsi che non abbia un ID nella tabella figlio che non esiste nella tabella padre. –

+0

Esattamente. Grazie, Gabriele, per averlo spiegato. – Dmitry

1

Per utilizzare chiavi esterne in mysql, è necessario creare indici su entrambe le tabelle. Ad esempio, se si desidera che il campo a_id sulla tabella faccia riferimento al campo id nella tabella a, è necessario creare indici su entrambi a.id e b.a_id prima di poter creare il riferimento.

Aggiornamento: qui si può leggere di più: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

+0

Il collegamento che si applica si applica solo ai database InnoDB in MySQL. Un collegamento migliore può essere trovato su "http://dev.mysql.com/doc/refman/5.1/en/example-foreign-keys.html". –

+0

Penso che MySQL crei automaticamente indici su chiavi primarie e su colonne di riferimento – Dmitry

2

Si descrivono un costrutto di database molto comune; si chiama "relazione molti-a-molti".

Gli indici non dovrebbero avere alcun impatto su questo schema. In effetti, gli indici non dovrebbero influire su alcuno schema. Gli indici sono un compromesso tra spazio e tempo: gli indici specificano che sei disposto a utilizzare spazio di archiviazione aggiuntivo, in cambio di ricerche più rapide attraverso il database.

Wikipedia ha un eccellente articolo su ciò che gli indici del database sono: viene aggiunto Index (database)

3

Un indice come un veloce sguardo in su per i dati nella tabella. Un indice può avere vincoli, in quanto la colonna o le colonne utilizzate per rendere l'indice potrebbe essere univoco (univoco: viene restituita solo una riga nel database per quell'indice o non univoca: è possibile restituire più righe). La chiave primaria per la tabella è un indice univoco e di solito ha solo una colonna.

Una chiave esterna è un valore in una tabella che fa riferimento a un indice univoco in un'altra tabella. È usato come un modo per relazionarsi ai tavoli insieme. Ad esempio, una tabella figlio può cercare la singola riga padre tramite la sua colonna che è un indice univoco nella tabella padre.

+0

Vincolo (UNICO in particolare), in pratica, è una proprietà di una colonna, non di un indice – Dmitry

3

Domanda: Puoi spiegare che cosa sarebbe un indice in questo scenario e in che modo si differenzia da una chiave esterna e come questo influisce sulla progettazione del mio database?

Le chiavi esterne in questo caso sono le due colonne nella tabella Posts_Tags. Con una chiave esterna, ogni colonna di chiave esterna deve contenere un valore dalla tabella principale a cui fa riferimento.In questo caso, le tabelle Post e Tag.

Posts_Tags-> PostID deve essere un valore contenuto in Posts-> postID

Posts_Tags-> TagID deve essere un valore contenuto nel tag-> TagID

pensi ad un indice come una colonna che è stata dato maggiore velocità ed efficienza per l'interrogazione/ricerca dei valori da esso, al costo di una maggiore dimensione del database. In generale, le chiavi primarie sono indici e altre colonne che richiedono query/ricerche sul tuo sito web, nel tuo caso, probabilmente il nome di un post (Post-> PostName)

Nel tuo caso, gli indici avranno un impatto minimo sul tuo design (sono belli da avere per velocità ed efficienza), ma le tue chiavi esterne sono molto importanti per evitare la corruzione dei dati (con valori che non corrispondono a un post e/o tag).

Problemi correlati