2012-03-21 16 views
8

¿Cuál es la mejor práctica para almacenar datos en una base de datos que solo requiere una sola entrada? Un ejemplo serían los datos de configuración que se relacionan con toda la aplicación/sitio web. ¿Es común crear una tabla para esto que tenga solo una entrada?¿Cuál es la mejor forma de almacenar datos individuales no repetitivos en una base de datos?

lo que pido en el contexto de una base de datos MongoDB, aunque creo que la pregunta es válida también para bases de datos SQL.

+1

Wouldn ¿Será mejor que la capa de aplicación se encargue de esto? Podría ser solo un único archivo de texto donde puede leer/escribir pares de valores clave. ¿Hay alguna razón particular para usar las bases de datos? – cctan

Respuesta

0

Para las bases de datos MongoDB, suelo crear una nueva "tabla", pero para bases de datos SQL eso implica mucho más (especialmente cuando otros también trabajan en la misma base de datos; SQL no es tan maleable), , es posible que desee ser un poco más cuidadoso con eso.

1

Si está utilizando una base de datos SQL, es probable que tenga columnas como nombre de la clave y el valor de cada atributo y se almacena como una fila. En MongoDB, puede almacenar toda la configuración relacionada en un solo documento JSON

+0

Está bien, supongo que si todos sus valores son del mismo tipo, o no le importan las conversiones de tipo ... –

5

Un ejemplo de una tabla auxiliar se encuentran comúnmente en las bases de datos sería llamado Constants y podrá retener dichos valores de PI, la idea de comenzar que todas las aplicaciones utilizando la base de datos se requiere que usen la misma escala y precisión. En SQL estándar, para garantizar que tengan como máximo una fila, p. (from Joe Celko):

CREATE TABLE Constants 
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY, 
CHECK (lock = 'X'), 
pi FLOAT DEFAULT 3.142592653 NOT NULL, 
e FLOAT DEFAULT 2.71828182 NOT NULL, 
phi FLOAT DEFAULT 1.6180339887 NOT NULL, 
... 
); 

Debido a que MySQL no soporta CHECK restricción entonces se requiere un disparador para lograr el mismo.

0

que utiliza una tabla de configuración con un nombre (config_name) y un valor (config_value). Incluso agrego un campo de ayuda para que los usuarios puedan ver a qué se destina el par nombre/valor o dónde se usa.

CREATE TABLE config (
    config_id bigint unsigned NOT NULL auto_increment, 
    config_name varchar(128) NOT NULL, 
    config_value text NOT NULL, 
    config_help text COMMENT 'help', 
    PRIMARY KEY (config_id), 
    UNIQUE KEY ix_config_name (config_name), 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Luego siguiente código php se recupera el valor de una clave, o devuelve una cadena vacía. Asume que $ db es una conexión de base de datos abierta. Todas las entradas están forzadas a minúsculas.

function getConfigValue($name) { 
    $retval=''; 
    $db = $this->db; 
    $sql = 'select config_value from config where LOWER(config_name)="'.strtolower($name).'"'; 
    $result = $db->Query($sql); 
    if ($result) { 
     $row = $db->FetchAssoc($result); 
     $retval = $row['config_value']; 
    } 
    return $retval; 
} 

Todo MySQL/PHP en este caso, pero el principio general se mantiene.

0

me acaba de crear la tabla de configuraciones, como rainecc dijo, y el uso de caché entonces para tomar que toda la mesa a la memoria :) y lo utilizan desde allí (caché). Será lo mejor.

2

Una mesa estaría bien, no hay razón por qué no utilizarlo sólo porque tendrá sólo una fila.

yo sólo tenía la idea más extraña (no me implementarlo pero por alguna razón se me había ocurrido). Puede crear una vista codificado así:

create view myConfigView 
as 
select 'myConfigvalue1' as configValue1, 'myConfigvalue2' as configValue2 

y hacer select * from myConfigView :)

pero de nuevo, no hay razón por qué no usar una tabla sólo porque tendrá sólo una fila

Cuestiones relacionadas