固定大小的数组数据库字段

时间:2008-10-23 21:55:16

标签: database database-design

我需要在数据库字段中存储多个日期值。这些值将绑定到“用户”,以便每个用户都拥有这些日期值的唯一集合。

我可以在这里使用一对多的关系,但是每个用户都会有4个日期值与之相关联,所以我觉得一对多的表会过度杀戮(在很多方面,例如速度),但如果我需要查询它们我需要这4个值在不同的领域,例如MyDate1 MyDate2 ......等等,然后用于获取它的SQL命令每次都要检查4个值。

所以一对多的关系可能是最好的解决方案,但是有更好的/更清洁的/更快的/更好的方式吗?我的设计是否正确?

该平台是MS SQL 2005,但任何平台上的解决方案都可以,我主要是寻找合适的数据库设计技术。

编辑: 4个字段代表同一事物的4个实例。

5 个答案:

答案 0 :(得分:2)

如果您将其作为四个单独的字段进行,那么您不必加入。要保存查询语法太可怕,您可以写:

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

正如评论中所提到的,IN运算符在日期字段(直至最后一个(毫秒)秒)时非常具体。您始终可以在子查询上使用日期时间函数,但BETWEEN不可用:

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

答案 1 :(得分:2)

某些数据库(如Firebird)具有数组数据类型,它完全按照您的描述进行操作。声明如下:

alter table t1 add MyDate[4] date;

答案 2 :(得分:1)

对于它的价值,规范化的设计是将日期存储为从属表中的行。

在单个列中存储多个值不是标准化设计;规范化明确表示每列只有一个值。

您可以确保以相应方式将不超过四行插入到从属表中:

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

但是,此设计不允许您强制使用日期值。

答案 3 :(得分:0)

如果有4个字段和用户ID(如果你确定,它不会超过它)?

答案 4 :(得分:-1)

创建四个日期字段并将日期存储在字段中。日期字段可能是用户表的一部分,或者它们可能位于以一对一关系连接到用户表的其他表中。这是你的电话。