Pergunta

Eu preciso armazenar vários valores de data em um campo de banco de dados. Esses valores serão vinculados a um "usuário" de tal forma que cada usuário terá seu próprio conjunto destes valores vários data.

Eu poderia usar um relacionamento um-para-muitos aqui, mas cada usuário terá exatamente 4 valores de data vinculados a eles, então eu sinto que uma mesa de um-para-muitos seria um exagero (em muitos aspectos, por exemplo, a velocidade), mas se eu necessária para consulta contra eles eu precisaria aqueles 4 valores para estar em diferentes campos por exemplo, MyDate1 MyDate2 ... etc. mas, em seguida, o comando SQL para buscar-lo teria que verificar para 4 valores cada vez.

Assim, o relacionamento um-para-muitos provavelmente seria a melhor solução, mas há uma melhor / mais limpo / mais rápido / whatever outra maneira ao redor? Am I projetá-lo corretamente?

A plataforma é MS SQL 2005, mas solução em qualquer plataforma vai fazer, eu estou na sua maioria à procura de técnicas db design adequadas.

EDIT:. Os 4 campos representam 4 instâncias da mesma coisa

Foi útil?

Solução

Se você fizer isso como quatro campos separados, então você não tem que participar. Para salvar a sintaxe de consulta de ser demasiado horrível, você poderia escrever:

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

Como mencionado nos comentários, o operador IN é bastante específico quando se trata de campos de data (até o mili última) segunda (). Você sempre pode usar funções de tempo de data na subconsulta, mas ENTRE está inutilizável:

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));

Outras dicas

Alguns bancos de dados como Firebird Tem tipo de dados Array, que faz exatamente o que você descreveu. Declara-se algo como isto:

alter table t1 add MyDate[4] date;

Por que vale a pena, o design normalizado seria armazenar as datas como linhas em uma tabela dependente.

Armazenar vários valores em uma única coluna não é um desenho normalizado; normalização significa explicitamente cada coluna tem exatamente um valor.

Você pode ter certeza que não mais do que quatro linhas são inseridas na tabela dependente desta maneira:

 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)
 );

No entanto, este projeto não permite que você fazer a data de valores obrigatórios.

Que tal ter 4 campos alongwith ID do usuário (se você tem certeza, ele não vai exceder a)?

Criar quatro campos de data e armazenar as datas nos campos. Os campos de data pode ser parte de sua tabela de usuário, ou eles podem estar em alguma outra tabela associada à tabela user em um relacionamento um-para-um. É a sua chamada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top