it-swarm.dev

Perché Joomla non usa le chiavi esterne nelle strutture della tabella principale?

Sto sviluppando un componente personalizzato e voglio usare una chiave esterna user_id A cui fa riferimento #__users(id). Ho notato che Joomla non utilizza alcuna chiave esterna nelle sue tabelle principali, ad esempio in #__user_notes O user_profiles.

Supponiamo che io voglia creare un'estensione per aggiungere commenti agli articoli. La struttura del tavolo è così:

CREATE TABLE IF NOT EXISTS `#__comp_comments` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `user_id` int(20) unsigned NOT NULL,
    `comment` text,
    PRIMARY KEY (`id`)
    /* PLACEHOLDER */
);

Ora ho due opzioni:

, FOREIGN KEY (`user_id`) REFERENCES `#__users`(`id`) ON UPDATE CASCADE ON DELETE CASCADE

e

, KEY `idx_userid` (`user_id`)

Qual è il tuo suggerimento? Usi le chiavi esterne nei componenti personalizzati o no? E perché?

6
Farahmand

Joomla ovviamente usa chiavi esterne per fare riferimento a chiavi primarie in altre tabelle. Questo è un concetto di base nei database e non funzionerebbe diversamente.

Quello che vuoi dire è qualcosa di diverso. Stai parlando di collegarli insieme in modo che mantengano l'integrità a livello di database. Ad esempio, se una riga nella tabella primaria viene eliminata, anche le tabelle "figlio" vengono eliminate automaticamente anche le loro righe, oppure è possibile eliminare la primaria solo se tutti i figli vengono eliminati per primi. Dipende un po 'da come è impostato. Questo si chiama "integrità referenziale".

In Joomla non utilizziamo l'integrità referenziale. Manteniamo invece sani i nostri dati a livello di applicazione. Vari eventi del plug-in consentono di rilevare uno stato di eliminazione o modifica o qualsiasi altra cosa e agire di conseguenza.

3
Bakual

Perché solo il motore di archiviazione InnoDB consente definizioni di chiave esterna e Joomla può essere installato su server che supportano solo le tabelle MyISAM.

Quindi, per un componente pubblico, è meglio evitare le chiavi esterne nelle strutture delle tabelle.

2
Farahmand