2010-10-22 4 views
1

J'ai un dossier de table où la référence parent_id fait référence à l'ID si ce dossier a un parent, sinon, parent_id est null. Est-ce correct ou j'ai besoin d'une table supplémentaire pour cette connexion ou une autre solution? La clé étrangère peut-elle être nulle du tout, et si cette solution peut avoir une plus grande durée d'exécution?Clé étrangère nulle - dégradation des performances

table folder(
    id int primary key,   //primary key in my table 
    parent_id int references id, //foreign key on id column in same table 
.... 
) 

Répondre

2

Vous pouvez avoir des clés étrangères NULL. Pas de problème. Je ne voudrais pas mettre une table supplémentaire uniquement pour les dossiers sans parent (dossiers racine). Cela rendra votre conception plus compliquée sans avantages.

+0

J'ai pensé table supplémentaire comme table ext (id_column, id_folder, parent_id_folder). Y a-t-il une dégradation des performances lorsque la colonne a beaucoup de valeurs NULL? – Jane

+0

Vous ne devriez pas avoir une énorme dégradation des performances. Vous pouvez ajouter un index sur la clé étrangère si cela aide certaines requêtes ... –

+0

Merci, ça aide! – Jane

2

Oui, une clé étrangère peut être fait d'accepter NULL valeurs:

CREATE TABLE folders (
    id   int NOT NULL PRIMARY KEY, 
    parent_id int NULL, 
    FOREIGN KEY (parent_id) REFERENCES folders (id) 
) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.06 sec) 

INSERT INTO folders VALUES (1, NULL); 
Query OK, 1 row affected (0.00 sec) 

Temps d'exécution n'est pas affectée si une clé étrangère est configuré pour accepter les valeurs NULL ou non.


MISE À JOUR: Suite à des commentaires ci-dessous:

Gardez à l'esprit que les index B-tree sont les plus efficaces pour les données de haute cardinalité (c.-à-colonnes avec beaucoup de valeurs possibles, où les données dans la colonne est unique ou presque unique). Si vous avez de nombreuses valeurs NULL (ou toute autre valeur répétée), l'optimiseur de requête peut choisir de ne pas utiliser l'index pour filtrer les enregistrements de votre jeu de résultats, car il serait plus rapide de ne pas le faire. Cependant, ce problème est indépendant du fait que la colonne est une clé étrangère ou non.

+0

Mais dans la requête, si ma colonne a beaucoup de NULLs? Ou pour créer une fausse racine de dossier avec id = 0? – Jane