【发布时间】:2015-03-24 15:41:05
【问题描述】:
我有一个包含 500 多个表的大型应用程序,我必须将应用程序转换为时区感知(当前应用程序使用 new java.util.Date()、GETDATE() 和服务器的时区)。即不支持任何时区。
我已将此任务组织成几个步骤以简化开发,我确定的第一个步骤是根据服务器的时区将所有旧日期更改为UTC。 (主要位于一个时区,所以这是我的最佳猜测)
接下来,我需要修改数据库和应用程序代码,以使用时区名称和偏移量保存所有 UTC 日期,这就是我的问题所在......
我将如何修改数据库/表以更好地支持这一点?
我的想法是:
- 对于表中的每个日期/时间列,添加两个额外的列(用于 tz-name 和偏移量)
- 这感觉像是糟糕的设计
- 添加一个包含列
pk、TABLE_NAME、COL_NAME、ROW_PK、TZ_NAME、TZ_OFFSET的表- 虽然更便携,但此表最终将包含数百万行,因为它是将整个数据库的日期塞进一张表中
- 为每个现有表(一对一)添加一个新表,其中包含 tz 名称和每个日期列的偏移量
- 虽然不可移植,但这似乎是最好的(关系)选项
有没有人有任何其他想法或最佳实践?
【问题讨论】:
-
为什么要将时区存储在数据库中。我希望后端只使用一个时区,即 UTC,并在必要时在前端进行转换,但不存储它。
-
基本上是为了获取数据保存的时区,我不能假设用户不会更改时区,我需要数据库中每条记录的准确历史时间
-
我建议:如果用户添加日期/时间信息,将用户本地时区转换为UTC并将UTC保存在数据库中。如果 GUI 向用户显示一个值,则在显示期间将其转换为他们的本地时间。
-
谢谢,我完全理解,我的问题是如何构建我现有的数据库以使用当前数据保存时区名称
-
听起来您正在寻找
datetimeoffset或timestamp with timezone类型-mysql 都不支持这两种类型。您可能需要存储多个列。
标签: mysql sql-server database-design architecture timezone