web-dev-qa-db-fra.com

Pourquoi Joomla n'utilise-t-il pas de clés étrangères dans les structures de table principales?

Je développe un composant personnalisé et souhaite utiliser une clé étrangère user_id Référencée à #__users(id). J'ai remarqué que Joomla n'utilise aucune clé étrangère dans ses tables principales, par exemple dans #__user_notes Ou user_profiles.

Supposons que je souhaite créer une extension pour ajouter des commentaires à des articles. La structure de la table est comme suit:

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 */
);

Maintenant, j'ai deux options:

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

et

, KEY `idx_userid` (`user_id`)

Quelle est votre suggestion? Utiliser des clés étrangères dans des composants personnalisés ou non? Et pourquoi?

6
Farahmand

Joomla utilise bien sûr des clés étrangères pour référencer des clés primaires dans d'autres tables. C'est un concept de base dans les bases de données et cela ne fonctionnerait pas autrement.

Ce que vous voulez dire est quelque chose de différent. Vous parlez de les lier ensemble afin qu'ils conservent l'intégrité au niveau de la base de données. Par exemple, si une ligne de la table primaire est supprimée, les tables "enfants" sont automatiquement supprimées, ou vous pouvez uniquement supprimer la principale si tous les enfants sont supprimés en premier. Cela dépend un peu de la configuration. C'est ce qu'on appelle "l'intégrité référentielle".

Dans Joomla, nous n’utilisons pas l’intégrité référentielle. Nous gardons plutôt nos données saines au niveau de l'application. Divers événements de plug-in vous permettent d'attraper un état de suppression, de modification ou autre, et d'agir en conséquence.

3
Bakual

Parce que seul le moteur de stockage InnoDB autorise les définitions de clé étrangère et que Joomla peut être installé sur des serveurs ne prenant en charge que les tables MyISAM.

Ainsi, pour un composant public, il est préférable d'éviter les clés étrangères dans les structures de table.

2
Farahmand