我需要在数据库字段中存储几个日期值。这些值将绑定到一个“用户”,以便每个用户都有他们自己的几个日期值的唯一集合。
我可以在这里使用一对多的关系,但每个用户都会有确切的4个日期值与它们相关联,所以我觉得一对多的表可能会过分(在许多方面,例如速度),但是如果我需要对它们进行查询,我需要这4个值来处理不同的领域,比如MyDate1 MyDate2 .等等,但是SQL命令每次都要检查4个值。
因此,一对多的关系可能是最好的解决方案,但是否有更好的/更清洁的/更快的/任何其他方法?我设计得对吗?
该平台是mostly 2005,但任何平台上的解决方案都可以,我主要是在寻找合适的db设计技术。
编辑:4个字段表示相同事物的4个实例。
发布于 2008-10-23 21:58:49
如果您将它作为四个单独的字段来执行,那么您就不必加入。为了避免查询语法太糟糕,您可以编写:
SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);正如注释中提到的,in运算符在日期字段(直到最后一个(Milli)秒)时非常具体。您可以始终在子查询上使用日期时间函数,但之间不能使用:
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));发布于 2008-10-23 23:49:55
有些数据库(如火鸟 )具有数组数据类型,这与您所描述的完全相同。声明如下:
alter table t1 add MyDate[4] date;发布于 2008-10-23 22:35:48
就其价值而言,规范化的设计是将日期存储为依赖表中的行。
将多个值存储在一个列中并不是一个规范化的设计;规范化显式意味着每个列都有一个值。
您可以确保以这种方式将不超过四行插入到从属表中:
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)
);但是,此设计不允许您强制使用日期值。
https://stackoverflow.com/questions/231695
复制相似问题