Pregunta

Necesito almacenar varios valores de fecha en un campo de base de datos. Estos valores se vincularán a un " Usuario " de modo que cada usuario tendrá su propio conjunto único de estos varios valores de fecha.

Podría usar una relación de uno a muchos aquí, pero cada usuario tendrá exactamente 4 valores de fecha vinculados a ellos, por lo que creo que una tabla de uno a muchos sería una exageración (en muchos aspectos, por ejemplo, la velocidad), pero si necesario consultar contra ellos. Necesitaría esos 4 valores para estar en diferentes campos, por ejemplo MyDate1 MyDate2 ... etc. pero luego el comando SQL para buscarlo tendría que verificar 4 valores cada vez.

Entonces, la relación uno a muchos probablemente sería la mejor solución, pero ¿hay una mejor / más limpia / más rápida / lo que sea de otra manera? ¿Lo estoy diseñando correctamente?

La plataforma es MS SQL 2005 pero la solución en cualquier plataforma funcionará, principalmente estoy buscando técnicas de diseño de db adecuadas.

EDITAR: Los 4 campos representan 4 instancias de la misma cosa.

¿Fue útil?

Solución

Si lo haces como cuatro campos separados, entonces no tienes que unirte. Para evitar que la sintaxis de la consulta sea demasiado horrible, puede escribir:

SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);

Como se mencionó en los comentarios, el operador IN es bastante específico cuando se trata de campos de fecha (hasta el último (mili) segundo). Siempre puede usar funciones de fecha y hora en la subconsulta, pero ENTRE no se puede usar:

SELECT * FROM MyTable WHERE date_trunc('hour', 'DateLiteral') 
IN (date_trunc('hour', MyDate1), date_trunc('hour', MyDate2), date_trunc('hour', MyDate3), date_trunc('hour', MyDate4));

Otros consejos

Algunas bases de datos como Firebird tienen un tipo de datos de matriz, que hace exactamente lo que usted describió. Se declara algo como esto:

alter table t1 add MyDate[4] date;

Para su valor, el diseño normalizado sería almacenar las fechas como filas en una tabla dependiente.

El almacenamiento de múltiples valores en una sola columna no es un diseño normalizado; la normalización explícitamente significa que cada columna tiene exactamente un valor.

Puede asegurarse de que no se inserten más de cuatro filas en la tabla dependiente de esta manera:

 CREATE TABLE ThisManyDates (n INT PRIMARY KEY);
 INSERT INTO ThisManyDates VALUES (1), (2), (3), (4);

 CREATE TABLE UserDates (
   User_ID INT REFERENCES Users,
   n INT REFERENCES ThisManyDates,
   Date_Value DATE NOT NULL,
   PRIMARY KEY (User_ID, n)
 );

Sin embargo, este diseño no permite que los valores de fecha sean obligatorios.

¿Qué te parece tener 4 campos junto con la ID de usuario (si estás seguro, no excederá eso)?

Cree cuatro campos de fecha y almacene las fechas en los campos. Los campos de fecha pueden ser parte de su tabla de usuario o pueden estar en alguna otra tabla unida a la tabla de usuario en una relación de uno a uno. Es tu decisión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top