在SQL Server上存储时区



我正在从事一项全球调度服务,该服务使用不同时区域的物理位置。这些时区必须与每个位置一起在数据库中持续存在。问题是,最好如何存储?

我们当前使用自定义时区表,该表将自定义整数ID映射到Microsoft时区域字符串标识符。我希望存储IANA时区标识符。我们的数据库是SQL Server,它可以在C#中使用Entity Framework 6中访问。我们使用Nodatime处理时间。解决方案必须与所有这些技术合作。

我看到了两种不同的方法:

  1. 只需将IANA标识符与每个位置一起存储为字符串。
  2. 将所有IANA标识符存储在单独的表中,并使用外键链接到它。

第一个解决方案可能是最简单的,因为它很容易允许使用新的标识符,并且可以将数据紧密地组合在一起。但是,它确实具有使用大量空间的缺点。

第二个解决方案要求我们每次需要时区时都可以在时区表上加入 - 相当经常 - 但几乎不需要空间。如果需要,必须将新的时区标识符添加到该表中。它还介绍了这些神奇的整数ID(使用的外键),这些ID可能被误认为是常见的标识符(我们目前有此问题,ID已移出数据库并进入了使用的代码词典,而不是数据库表)。

当我写这篇文章时,我想知道,是否可以为SQL Server创建自定义时区UDT,可以将时区保存并加载为字符串标识符,但可以更有效地存储以用户隐藏的格式。

虽然两种方法都可以起作用,但常见的做法只是将IANA时区标识符存储为字符串。它们确实是唯一的标识符,因此可以这样对待。"America/Argentina/ComodRivadavia"目前是最大的字符串,具有32个字符 - 因此varchar(32)就足够了。不过,我通常使用varchar(50)只是为了成为未来的安全。

您可以通过标准化到查找桌来保存的几千字节存储,通常不值得加入,恕我直言。但是,像任何权衡一样,您应该评估这两个选项,以查看哪种方案对您的情况更好。使用查找表不一定错误

最新更新