Bueno, esta es una pregunta de diseño simple que me he preguntado muchas veces y nunca he encontrado una solución satisfactoria. Mi ejemplo es con php-sql, pero esto ciertamente se aplica también a otros idiomas.Diseño de la base de datos: ¿Coincidencia de claves de base de datos sql con las constantes php?
Tengo una pequeña tabla de base de datos que contiene muy pocas entradas y que casi nunca necesita actualizarse. por ejemplo, este usertype
tabla:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
Ahora en el código php, a menudo tienen que comprobar o comparar el tipo de usuario que estoy tratando. Dado que los tipos de usuario están almacenados en la base de datos, puedo:
1) Seleccione * de la tabla usertype en la creación de instancias de clases y guárdelo en una matriz.
Luego todos los ids están disponibles para el código, y puedo hacer una simple selección para obtener las filas que necesito. Esta solución requiere una matriz y una consulta db cada vez que se crea una instancia de la clase.
$query = "SELECT info, foo FROM user WHERE usertype_id = ".$usertypes['admin'];
2) utilizar la columna de name
para seleccionar la correcta usertype_id
, por lo que pueden unirse eficazmente con otras tablas. Esto es más o menos equivalente a 1), pero sin necesidad de almacenar en caché toda la tabla tipo de usuario en el objeto php:
$query = "SELECT info, foo FROM user JOIN usertype USING (usertype_id) WHERE usertype.name = 'admin' ";
3) Definir las constantes que coinciden con las llaves en la mesa de tipo de usuario:
// As defines
define("USERTYPE_ADMIN",1);
define("USERTYPE_REGUSER",2);
//Or as class constants
const USERTYPE_ADMIN = 1;
const USERTYPE_REGUSER = 2;
Y luego haz una simple selección.
$query = "SELECT info, foo FROM user WHERE usertype_id = " . USERTYPE_ADMIN;
Ésta es probablemente la solución más eficiente de los recursos, pero es malo para mantener, ya que hay que actualizar la tabla y el código si es necesario modificar algo en la mesa .. usertype
4) Deseche la tabla usertype
y solo guarde los tipos en el código php. Realmente no me gusta esto porque permite que cualquier valor entre en la base de datos y se asigne al tipo de usuario. Pero tal vez, considerando todo, no es tan malo y simplemente estoy complicando algo que debería ser simple ...
De todos modos, para resumir, la solución que más me gusta es la # 2 porque es coherente y con índice en usertype.name
, no puede ser tan malo. Pero lo que a menudo he terminado usando es # 3, por eficiencia.
¿Cómo lo harías? ¿Alguna mejor solución?
(edit: consulta fija en el # 2)
Esto funcionará si la tabla tipo va a ser utilizado por una sola tabla (como en el ejemplo). Pero, ¿qué sucede si varias tablas necesitan usar el mismo tipo de enumeración? – Vincent
Bueno, entonces necesitarás usar el método normalizado. Y luego te quedas atascado constantemente consultando el DB por los valores. O eso, o manteniéndolo en dos lugares (lo cual no es divertido) ... – ircmaxell