当设计一个产品,其中很多地方要把日期类型保存到数据库中,如果产品有兼容不同数据库产品的需求,那么,应当怎样设计呢?
(1)
当然,首先想到的是,使用数据库的Date或DateTime类型,可是看看不同数据库这些类型间的区别吧,真让人望而止步。
mysql数据库:它们分别是 date、datetime、time、timestamp和year。
date :“yyyy-mm-dd”格式表示的日期值
time :“hh:mm:ss”格式表示的时间值
datetime: “yyyy-mm-dd hh:mm:ss”格式
timestamp: “yyyymmddhhmmss”格式表示的时间戳值
year: “yyyy”格式的年份值。
date “1000-01-01”到“9999-12-31” 3字节
time “-838:59:59”到“838:59:59” 3字节
datetime “1000-01-01 00:00:00” 到“9999-12-31 23:59:59” 8字节
timestamp 19700101000000 到2037 年的某个时刻 4字节
year 1901 到2155 1字节
oracle数据库:
Date类型的内部编码为12
长度:占用7个字节
数据存储的每一位到第七位分别为:世纪,年,月,日,时,分,秒
TIMESTAMP是支持小数秒和时区的日期/时间类型。对秒的精确度更高
TIMESTAMP WITH TIME ZONE类型是TIMESTAMP的子类型,增加了时区支持,占用13字节的存储空间,最后两位用于保存时区信息
INTERVAL 用于表示一段时间或一个时间间隔的方法.在前面有多次提过.INTERVAL有两种类型.
YEAR TO MONTH 能存储年或月指定的一个时间段.
DATE TO SECOND存储天,小时,分钟,秒指定的时间段.
sql server:datetime和smalldatetime
datetime数据类型所占用的存储空间为8个字节,其中前4个字节用于存储1900年1月1日以前或以后的天数,数值分正负,正数表示在此日期之后的日期,负数表示在此日期之前的日期;后4个字节用于存储从此日零时起所指定的时间经过的毫秒数。
smalldatetime数据类型使用4个字节存储数据。其中前2个字节存储从基础日期1900年1月1日以来的天数,后两个字节存储此日零时起所指定的时间经过的分钟数。
smalldatetime数据类型与datetime数据类型相似,但其日期时间范围较小,从1900年1月1日到2079年6月6日。此数据类型精度较低,只能精确到分钟,其分钟个位为根据秒数四舍五入的值,即以30秒为界四舍五入。
如果没有兼容多种数据库这个要求,我会毫不犹豫的使用数据库的Date类型。因为如果使用Java框架产生代码,对数据库中定义为Date类型的字段,甚至能在页面上产生出JS的时间选择框,的确能节省很多开发时间。
而兼容不同数据库,就希望产品在由一种数据库,迁移到另外一种数据库时,尽可能小的代价,使用了Date,看来就很困难了。
有一个疑问,不知道目前流行的ORM对这个处理得是不是好?因为工作不怎么涉及这方面,所以不大了解。
在之前的设计开发中,因为有支持多种数据库这种需求,所以首先否定了日期时间这样的类型。
(2)
曾经使用过毫秒数(java的 System.currentTimeMillis())这种方式,但是选用这个方式,考虑的不是使用起来是否方便或者数据迁移,而是考虑到下面的原因:
java取到的毫秒数是对时间点的一种准确描述。定义如下:
java.lang.System.currentTimeMillis(),
它返回从 UTC 1970 年 1 月 1 日午夜开始经过的毫秒数。
我们可以看到,这个定义,保证了这个时间值能够被后续设计开发的人员正确和准确的理解,能够为所有的应用正确理解,能够在所有时区上正确反映为正常的时间形式。
当时的产品设计是有海外客户的,所以当时的设计,在数据库里保存的,应该是一个“准确的时间”。例如“20120926080000”实际上并没有严格的表示出时间,因为北京时间2012年9月26日8点和格林威治时间2012年9月26日8点显然是不一样的。
虽然我们都是在一个确切的时区里,例如中国都是使用东八区时间,但是需要考虑的是:
(一)有些产品是可能有海外客户的
(二)产品所运行的机器,时区的设置未必都是东八区。
在这种情况下,如果数据库里的时间不准确,会给程序运行带来问题。
这种方式最大的缺点在于:
- 不方便对时间进行分组查询,比如按月统计、按季 统计
- DBA在维护时,不能直观的根据返回的行结果,看到简单明了的结果(看到的是毫秒数)
使用这种方式的特点是牺牲一点易用性和可理解性(不易于维护和理解),满足了查询结果的直观性和准确性要求,同时最大限度考虑运行效率。
为了解决这个问题,我设计了一个辅助的措施,就是建立一个数据库函数来进行时间转换,把毫秒数的时间转为制定时区和格式的时间串,DBA在维护时可以使用。测试了Oracle和DB2上,都可以这样。
例如之前的查询的时候为:
SELECT username,user_addtime from userinfo
这个查询显示的是毫秒数
使用内置函数后写成:
SELECT username,date2str(user_addtime) from userinfo
这样返回的就是东八区、预先定义好格式的字符串了。
(3)
在之后的设计里,还使用过YYYYMMDDHHmmSST格式,其中的“T”指时区,加入时区,带来的影响有:
1)日期时间字段就不能在使用数值来存储了,字符串比数字存储和检索的效率都要低。
2)应用程序需要加上额外的处理
带来的好处是:
1)便于DBA维护
2)到什么时候,即便没有看到数据库设计文档,都能看明白并准确理解数据库中一条信息中,这个字段保存到确切信息
使用这种方式的特点是牺牲一点效率,满足了查询结果的直观性和准确性要求。
总结一下,字段类型的选择,还是根据场景的需要来选择,从功能、效率要求、持续开发的要求、维护的要求几个方面综合考虑。
相关推荐
数据库字段命名规范是数据库设计的重要环节,良好的命名规范可以提高数据库的可读性、可维护性和可扩展性。以下是数据库字段命名规范的详细介绍: 一、数据库表名命名规范 * 数据库表名在命名时,首字母大写,用...
- DATE:日期类型。 - BLOB:二进制大对象,用于存储非结构化数据。 每个数据库系统都有其特定的数据类型,选择合适的数据类型对于优化存储、性能和数据准确性至关重要。在设计数据库时,应根据实际需求来选取...
"数据库字段属性详解" 数据库字段是数据库管理系统中最基本的组成部分,它定义了数据在数据库中的存储结构和约束关系。...通过了解数据库字段类型、约束、默认值和索引等知识点,我们可以更好地设计和管理数据库。
在数据库管理中,字段是构成表的基础元素,每个字段都有特定的数据类型(如整型、字符串型、日期型等)和属性(如是否为主键、允许空值等)。这款工具的主要功能可能包括: 1. **字段查看与导出**:工具能够列出...
MySQL数据库的列类型,也称为字段类型,是数据库设计中的关键元素,决定了数据的存储、处理和检索方式。这些类型大致分为数值类、字符串类和日期/时间类。以下是各类别的详细说明: **数值类数据列类型:** 1. **...
在数据库设计与管理中,选择合适的字段类型对于数据的存储效率、查询性能以及数据完整性至关重要。SQL Server 提供了丰富的数据类型,覆盖了从基本数值到复杂文本、图像等各类数据的存储需求。下面将详细解析《SQL ...
这段代码将在指定的表中添加一个新的文本类型字段。根据实际需求,你可以修改字段属性并将其整合到更复杂的数据库管理系统中。 总之,创建Mdb字段是数据库设计和管理的基础操作,它涉及到对数据类型的理解、字段...
MySQL 数据库中的列类型,也就是字段类型,是数据库设计中的关键元素,决定了数据的存储方式和处理方式。列类型分为三大类:数值类、字符串类和日期/时间类。 数值类数据列类型主要包括整型和浮点型。整型又分为 ...
例如,日期字段可以使用日期类型,数值字段可以使用整型或浮点型等。正确的数据类型不仅可以节省存储空间,还可以提高查询效率。 5. **数据标准化:** - 数据标准化对于保证数据的一致性和准确性至关重要。例如,...
数据库设计文档.pdf 本文档是人资信息管理系统数据库设计文档,主要对软件后台数据库的概念模型设计和物理模型设计作出了统一的规定,同时确定了每个表的数据字典构造。该文档是开发人员、测试人员编码及测试的重要...
数据库模块详细设计知识点总结 一、引言 数据库模块详细设计是软件开发过程中的一部分,旨在设计和实现一个高效、可靠的数据库模块。数据库模块是软件系统的核心组件之一,负责存储和管理大量数据。因此,数据库...
数据表的设计包括字段设计、主键设计、索引设计和关系设计等方面。 在数据表设计中,我们需要确定数据表的结构、字段类型、主键、索引和关系等。 数据库性能优化 数据库性能优化是指对数据库的查询优化、索引优化...
数据类型的实际最大长度由数据库页面大小决定,具体最 大长度算法如表 的区别在于前者长度不足时,系统自动填充空 格,而后者只占用实际的字节空间。 表 数据库页面大 实际最大长度 注:这个限制长度只针对建表的...
每个模块的字段设计都紧密贴合业务需求,通过合理布局和有效操作,可以实现对企业各项业务的精细化管理。因此,无论是系统开发者还是企业管理者,都需要对这些字段有深入的理解和应用能力,以提升企业的信息化管理...
4. **选择合适的数据类型**:根据数据特性选择最合适的数据类型,例如,日期时间类型、整型、字符串等。 5. **外键约束**:确保数据完整性,防止非法数据插入,但过度使用可能影响性能。 6. **事务管理**:对于涉及...
在比较这些数据库的数据类型时,可以发现它们在基础类型上有很多共性,如整型、字符型和日期型。然而,每个系统都有其特色,如Oracle的NUMBER和POSTGRESQL的JSON。在选择数据库时,应根据具体的应用场景和数据特性...
对于字段类型,数字类型字段可以使用_N后缀,字符类型使用_C,日期字段使用_D。考虑字段的约束和默认值,以确保数据的完整性和一致性。 3. **选择键** 主键的选择至关重要,应确保其唯一性和不变性。系统生成的...
- 各字段的数据类型设计需考虑其存储的数据性质,如整型、浮点型、字符串等,并选择合适的长度。 - 对于特殊类型的字段,如日期时间,应使用专门的数据类型以提高处理效率。 #### 2.8 使用SEQUENCE/PROCEDURE/...