De tamanho fixo de campo de banco de dados de matriz
-
04-07-2019 - |
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
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.