Si tengo varios tipos de un objeto, ¿cuándo debería ser object.type una cadena y cuándo debería ser una clave externa?

StackOverflow https://stackoverflow.com/questions/1005384

Pregunta

Digamos que tengo libros que pueden ser romance, ficción o misterio. Tengo 2 opciones realistas para almacenar estos datos. Una es tener una columna de tipo en la tabla de mis libros que sea una cadena con el valor "romance", "ficción", o "misterio". La otra es crear una tabla de tipos de libros y almacenar los tipos allí. Entonces mis libros tendrían una clave foránea type_id que hace referencia a la tabla book_types.

Mi pregunta es ¿cómo selecciono cuál es la mejor? He visto el método de cadena utilizado en el complemento de Autenticación Restful Rails que contiene información sobre el estado de los usuarios: 'inactivo', 'activo', 'pendiente' ...

¿Hay un impacto en el rendimiento por usar el método de la tabla de búsqueda considerando que consultaré esta información todo el tiempo?

¡Gracias!

¿Fue útil?

Solución

El enfoque de clave externa funcionará mejor. La comparación de cuerdas ralentizará las cosas. Es mucho más rápido comparar números.

Si desea acelerar las consultas aún más, agregue un índice en la columna que está usando para hacer referencia a la clave externa. A diferencia de las claves primarias, los índices no se crean automáticamente para las claves externas.

Otros consejos

si nunca hay más información para almacenar contra algo, la cadena normalmente está bien (aunque este es un valor no transitorio, por lo que no es de forma normal).

Sin embargo, esto parece ser un buen candidato para una tabla, por lo que es posible que desee hacer más con las categorías, por lo que debería ser una tabla de referencia, imo.

En la mayoría de los casos, el enfoque con una clave externa para una tabla separada es mejor: ventajas:

  • La tabla separada te da una Manera extensible para validar la entrada. Poner una restricción de verificación codificada en la definición de tabla luego requiere una TABLA ALTER para agregar una nuevo tipo

  • Si alguna vez necesita modificar el texto de tipo por algún motivo (por ejemplo, " romance " - > " ficción de mujeres > " para un ejemplo cojo), solo tendrá una actualización ligera en la tabla de búsqueda .

  • Posiblemente podría tener tipos para los que aún no hay entradas y la tabla separada le permite usar una combinación externa para incluir el tipo en los conjuntos de resultados de SQL.

  • Desde la perspectiva de la interfaz, una tabla separada le permite generar fácilmente una lista desplegable de tipos que no requieren codificación en la interfaz de usuario.

En lo que respecta al rendimiento, con el índice adecuado en el FK, cualquier motor RDBMS tendrá un buen desempeño. Las combinaciones son para lo que está diseñado un RDBMS.

Yo usaría fk. Menos información duplicada.

EDITAR: Mejor solución: Código MySql:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top