Utilizando una clave externa a una tabla de búsqueda es el enfoque que uso. De hecho, uso esto incluso cuando utilizo una base de datos que admite ENUM (por ejemplo, MySQL).
Para simplificar, puedo omitir el omnipresente "id
" para la tabla de búsqueda, y simplemente usar el valor real que necesito en mi tabla principal como la clave principal de la tabla de búsqueda. De esta forma, no es necesario que se una para obtener el valor.
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)
);
Es cierto que el almacenamiento de las cadenas tiene más espacio que la aplicación de ENUM
de MySQL, pero a menos que la tabla en cuestión cuenta con millones de filas, poco importa.
Otras ventajas de la tabla de búsqueda es que usted puede agregar o quitar un valor de la lista con un simple INSERT
o DELETE
, mientras que con ENUM
usted tiene que utilizar ALTER TABLE
para redefinir la lista.
También intente consultar la lista actual de valores permitidos en un ENUM
, por ejemplo para rellenar una lista de selección en su interfaz de usuario. ¡Es una gran molestia! Con una tabla de búsqueda, es fácil: SELECT status from BugStatus
.
También puede agregar otras columnas de atributos a la tabla de búsqueda si es necesario (por ejemplo, para marcar las opciones disponibles solo para los administradores). En un ENUM
, no puede anotar las entradas; solo son valores simples.
Otra opción además de una tabla de consulta sería utilizar CHECK
limitaciones (siempre y cuando la base de datos de los apoya - MySQL no lo hace):
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
summary VARCHAR(80),
...
status VARCHAR(20) NOT NULL
CHECK (status IN ('NEW', 'OPEN', 'FIXED'))
);
Pero este uso de una restricción CHECK
sufre de la misma desventajas como ENUM
: difícil cambiar la lista de valores sin ALTER TABLE
, difícil de consultar la lista de valores permitidos, valores difíciles de anotar.
PD: el operador de comparación de igualdad en SQL es un solo =
. El doble ==
no tiene significado en SQL.
Si este es un duplicado, por favor se agradable. Busqué la respuesta en StackOverflow antes de preguntar. – epochwolf