2012-01-10 2 views
0
DROP TABLE IF EXISTS `media_publications`; 
CREATE TABLE `media_publications` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `media_id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `description` varchar(1000) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY (`id`,`user_id`) 
) ENGINE=INNODB; 

Serait-il inutile d'avoir ici id comme clé primaire? Devrais-je avoir id + user_id comme clé primaire étant donné que j'en ai besoin comme clé étrangère à une autre table?Pratique des clés primaires

+0

Uhm, pourquoi juste 'id' ne suffit pas pour FK dans cette autre table? – zerkms

+1

La combinaison 'media_id' et' user_id' identifie-t-elle de manière unique une ligne? – Oded

+0

Avec le moteur InnoDB, vous ne pouvez presque jamais vous tromper en définissant le PK comme champ auto_increment. –

Répondre

2

Vous devez avoir id comme clé primaire car il s'agit d'un AUTO_INCREMENT et vous utilisez InnoDB. Vous pouvez créer un index unique sur les 2 colonnes (je mettrais user_id d'abord) à utiliser dans les clés étrangères de la table enfant

+0

Pourquoi mettre user_id en premier? –

+0

@amiawizard: il est donc utile pour les requêtes sur user_id seul – gbn

0

chaque combinaison unique de lignes ne doit pas être une clé primaire. potentiellement vous pouvez l'utiliser de cette façon, mais ce sera une solution délicate.

0

C'est une bonne idée de marquer explicitement la clé primaire comme clé primaire. De cette façon, vous n'aurez pas besoin d'ajouter un autre index qui dupliquera partiellement votre clé primaire ou la clé étrangère à la table des utilisateurs (bien que cette dernière ne soit pas actuellement disponible).

P.S. beaucoup de gens semblent confondre les champs d'identité avec les clés primaires. Le champ d'identité peut facilement faire partie de la clé primaire (mais devrait être le préfixe si la table est InnoDB et le champ est un entier auto-incrémenté).

0

Il est inutile d'avoir une clé onid, id_utilisateur car la clé primaire est toujours la dernière clé dans les index secondaires dans InnoDB (bien que l'optimiseur n'en profite pas toujours), et puisque la clé ne peut être utilisée que si la gauche La plus grande partie est spécifiée. Donc soit créer une clé seulement sur user_id, ou si elle doit être unique à travers user_id/id, sur user_id, id. De cette façon, vous pouvez utiliser l'index dans les deux requêtes WHERE id = et WHERE user_id =

Questions connexes