it-swarm-es.tech

¿Por qué Joomla no usa claves foráneas en las estructuras de la tabla principal?

Estoy desarrollando un componente personalizado y quiero usar una clave externa user_id Referenciada a #__users(id). Noté que Joomla no usa ninguna clave foránea en sus tablas principales, por ejemplo, en #__user_notes O user_profiles.

Suponga que quiero crear una extensión para agregar comentarios a los artículos. La estructura de la tabla es así:

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

Ahora tengo dos opciones:

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

y

, KEY `idx_userid` (`user_id`)

¿Cuál es tu sugerencia? ¿Usa claves foráneas en componentes personalizados o no? ¿Y por qué?

6
Farahmand

Joomla, por supuesto, utiliza claves foráneas para hacer referencia a claves primarias en otras tablas. Ese es un concepto básico en bases de datos y no funcionaría de otra manera.

Lo que quieres decir es algo diferente. Estás hablando de unirlos para que mantengan la integridad en un nivel de base de datos. Por ejemplo, si se elimina una fila de la tabla primaria, las tablas "secundarias" también eliminan sus filas automáticamente, o solo puede eliminar la primaria si todas las secundarias se eliminan primero. Eso depende un poco de cómo está configurado. Esto se llama "integridad referencial".

En Joomla, no usamos la integridad referencial. En cambio, mantenemos nuestros datos sanos a nivel de aplicación. Varios eventos de complementos le permiten detectar un estado de eliminación o cambio o lo que sea y actuar en consecuencia.

3
Bakual

Porque solo el motor de almacenamiento InnoDB permite definiciones de clave externa y Joomla se puede instalar en servidores que solo admiten tablas MyISAM.

Entonces, para un componente público, es mejor evitar claves foráneas en las estructuras de tabla.

2
Farahmand