L'utilisation d'une clé étrangère dans une table de recherche est l'approche que j'utilise. En fait, je l'utilise même lorsque j'utilise une base de données qui supporte ENUM (par exemple MySQL). Pour simplifier, je peux omettre l'omniprésent «id
» pour la table de recherche, et utiliser simplement la valeur réelle dont j'ai besoin dans ma table principale comme clé primaire de la table de recherche. De cette façon, vous n'avez pas besoin de faire une jointure pour obtenir la valeur.
CREATE TABLE BugStatus (
status VARCHAR(20) PRIMARY KEY
);
INSERT INTO BugStatus (status) VALUES ('NEW'), ('OPEN'), ('FIXED');
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
summary VARCHAR(80),
...
status VARCHAR(20) NOT NULL DEFAULT 'NEW',
FOREIGN KEY (status) REFERENCES BugStatus(status)
);
Certes, le stockage des chaînes prend plus de place que la mise en œuvre de MySQL de ENUM
, mais à moins que la table en question a des millions de lignes, il importe peu.
D'autres avantages de la table de consultation sont que vous pouvez ajouter ou supprimer une valeur dans la liste avec un simple INSERT
ou DELETE
, alors qu'avec ENUM
vous devez utiliser ALTER TABLE
pour redéfinir la liste.
Essayez également d'interroger la liste actuelle des valeurs autorisées dans un ENUM
, par exemple pour remplir une liste de sélection dans votre interface utilisateur. C'est un gros ennui! Avec une table de recherche, c'est facile: SELECT status from BugStatus
.
Vous pouvez également ajouter d'autres colonnes d'attributs à la table de recherche si vous en avez besoin (par exemple pour marquer les choix disponibles uniquement pour les administrateurs). Dans un ENUM
, vous ne pouvez pas annoter les entrées; ce ne sont que des valeurs simples.
Une autre option en plus d'une table de consultation serait d'utiliser CHECK
contraintes (à condition que la base de données les prend en charge - MySQL ne fonctionne pas):
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
summary VARCHAR(80),
...
status VARCHAR(20) NOT NULL
CHECK (status IN ('NEW', 'OPEN', 'FIXED'))
);
Mais cette utilisation d'une contrainte CHECK
souffre de la même inconvénients que le ENUM
: difficile de changer la liste des valeurs sans ALTER TABLE
, difficile d'interroger la liste des valeurs autorisées, difficiles à annoter les valeurs. PS: l'opérateur de comparaison d'égalité dans SQL est =
. Le double ==
n'a aucune signification en SQL.
S'il s'agit d'un doublon, s'il vous plaît soyez gentil. J'ai cherché la réponse sur StackOverflow avant de le demander. – epochwolf