2010-06-29 10 views
5

Sto lavorando su un open source PHP/applicazione MySQLÈ prassi comune per le app PHP/MySQL dichiarare le chiavi esterne?

Ho guardato phpBB, Wordpress, e altre applicazioni per vedere se sono specificati chiavi esterne o meno (per garantire l'integrità referenziale)

non riesco a trovare che hanno

È una pratica comune in questi tipi di applicazioni per specificare chiavi esterne nella struttura del database MySQL?

risposta

4

precedenti di utilizzo di MySQL il motore di archiviazione MyISAM per impostazione predefinita, che non supporta i vincoli di chiave esterna. A meno che tu non dichiari esplicitamente le tabelle per utilizzare il motore di archiviazione InnoDB, o cambi il motore di archiviazione predefinito a livello di server, non appaiano chiavi esterne, e non sorprende che gli sviluppatori di software che progettano MySQL non si preoccupino di usare vincoli di chiave esterna.

MySQL 5.5 è attualmente in versione beta e finalmente InnoDB sarà il motore di archiviazione predefinito. Quindi i vincoli delle chiavi esterne saranno supportati immediatamente.

Sì, le chiavi esterne sono consigliate. Questi vincoli aiutano a garantire che i tuoi dati soddisfino sempre l'integrità referenziale. L'alternativa è che il tuo database si riempia gradualmente di "briciole" o righe che fanno riferimento a una riga padre che non è più nel database. Questi possono portare a strani risultati da query e spazio sprecato, query inefficienti e finiscono per eseguire manualmente i lavori di pulizia che non sarebbero necessari se il database impone il rispetto della pulizia.


Re commento forma @Jacob: I punti positivi, ma assicuratevi di leggere recenti articoli confronto InnoDB MyISAM vs Anni fa, MyISAM era considerato il "motore di archiviazione veloce" e InnoDB è stato considerato il motore di archiviazione che si Dovrei usare a malincuore se non potessi fare a meno delle transazioni.

Ma InnoDB è migliorato notevolmente negli ultimi anni e, nella maggior parte dei casi, oggi InnoDB esegue più veloce di rispetto a MyISAM.

Oltre a MyISAM che supporta ancora l'indicizzazione di testo completo, come menzionato, ci sono sempre meno motivi per utilizzare MyISAM. Quando ho bisogno dell'indicizzazione del testo completo, posso mantenere una tabella MyISAM come mirror della mia memoria principale in InnoDB, oppure io uso Apache Solr.

+0

grazie, che ha senso – samJL

+0

+1 - assicurati di capire gli svantaggi dell'uso di innoDB su MyISAM. Fai una ricerca su Google per innoDB vs MyISAM, ci sono molti articoli che parlano dei vantaggi e degli svantaggi di entrambi. Quindi dipende davvero da cosa stai usando il DB per sapere se vuoi veramente/avere bisogno dell'integrità referenziale su alcuni dei vantaggi che MyISAM offre. Uno che ho appena scoperto la scorsa settimana è che innoDB non supporta le ricerche full-text (ancora), ma MyISAM fa :( – Jacob

+0

La mia regola empirica quando si parla di InnoDB vs MyISAM è: se hai bisogno di fare ricerca full text , usa MyISAM: la ricerca full text sembra essere l'unica cosa che MyISAM ha un grande vantaggio rispetto a InnoDB in termini di velocità –

0

MySQL non rispettava le chiavi esterne. Non funziona ancora, a meno che non si adottino misure.

Fuori dagli occhi, lontano dalla mente, giusto?

1

Non sono sicuro di quanto sia comune, ma ritengo che sia necessario esprimere le condizioni del modello di oggetto completamente indipendentemente dal fatto che il database sottostante le supporti completamente.

Se in genere si scrive ANSI SQL, se si procede e si aggiungono i vincoli di chiave esterna, quando il database li supporta, si utilizza un motore che li supporta oppure si passa a un altro database che li supporta, poi li prenderai per "gratis" e non dovrai tornare indietro e cercare di trovare tutte le relazioni.

Quindi, vorrei inserire le chiavi esterne in SQL in ogni caso, ma quello sono io e, di nuovo, potrebbe non essere comune.

+0

No, sono anch'io. A meno che non stia scrivendo uno schema usa e getta per una domanda SO. –

+0

grazie sembra una buona pratica – samJL

0

In MySQL solo InnoDB supporta anche le chiavi esterne e solo dopo MySQL 5.1.

Edit: InnoDB sarà il motore di memorizzazione predefinito in MySQL 5.5

Edit-Ignora: referenziale integrety sarà un "nuovo" in 6.1 in base alla loro tabella di marcia: le versioni http://en.wikipedia.org/wiki/MySQL#Future_releases

+0

Queste informazioni wiki sono davvero obsolete. MySQL 6 è accantonato e MySQL 5.5 supporterà InnoDB come motore di archiviazione predefinito. –

+0

@Bill Karwin, PHP 6 scartato, MySQL 6 scartato, c'è qualcosa con quei 6. –

+1

Ho modificato il paragrafo wikipedia a cui sei collegato. –

Problemi correlati