在 SQL 服务器上存储时区
Storing Time Zones on an SQL Server
我正在开发一项全球调度服务,该服务使用不同时区的物理位置。
这些时区必须与每个位置一起保存在数据库中。
问题是,如何最好地存储它们?
我们目前使用自定义时区 table,它将自定义整数 ID 映射到 Microsoft 时区字符串标识符。
我希望改为存储 IANA 时区标识符。
我们的数据库是一个 SQL 服务器,在 C# 中使用 Entity Framework 6 访问它。我们使用 NodaTime 处理时间。
解决方案必须与所有这些技术配合良好。
我看到了两种不同的方法:
- 只需将 IANA 标识符与每个位置一起存储为字符串。
- 将所有 IANA 标识符存储在单独的 table 中并使用外键 link 到它。
第一个解决方案可能是最简单的,因为它很容易允许使用新的标识符并将数据紧密地放在一起。
但是,它确实有使用大量 space.
的缺点
第二种解决方案要求我们在每次需要时区时都加入时区 table - 这很常见 - 但几乎不需要 space。
如果需要,必须将新的时区标识符添加到 table。
它还引入了这些神奇的整数 ID(使用的外键),这些 ID 可能会被误认为是众所周知的标识符(我们目前有这个问题,其中 ID 已移出数据库并移入使用的代码内字典而不是数据库table).
在我写这篇文章的时候,我在想,是否有可能为 SQL 服务器创建一个自定义时区 UDT,其中时区可以作为它们的字符串标识符保存和加载, 但以用户隐藏格式更有效地存储。
虽然这两种方法都可行,但通常的做法是将 IANA 时区标识符存储为字符串。它们确实是唯一标识符,因此可以这样对待它们。 "America/Argentina/ComodRivadavia"
目前是最大的字符串,有 32 个字符 - 所以 varchar(32)
就足够了。不过,我通常使用 varchar(50)
只是为了将来安全。
您可以通过规范化查找来节省几千字节的存储空间 table 通常不值得连接的性能影响,恕我直言。但是,就像任何权衡取舍一样,您应该评估这两个选项,看看哪个更适合您的场景。使用查找 table.
不一定 错误
我正在开发一项全球调度服务,该服务使用不同时区的物理位置。 这些时区必须与每个位置一起保存在数据库中。 问题是,如何最好地存储它们?
我们目前使用自定义时区 table,它将自定义整数 ID 映射到 Microsoft 时区字符串标识符。 我希望改为存储 IANA 时区标识符。 我们的数据库是一个 SQL 服务器,在 C# 中使用 Entity Framework 6 访问它。我们使用 NodaTime 处理时间。 解决方案必须与所有这些技术配合良好。
我看到了两种不同的方法:
- 只需将 IANA 标识符与每个位置一起存储为字符串。
- 将所有 IANA 标识符存储在单独的 table 中并使用外键 link 到它。
第一个解决方案可能是最简单的,因为它很容易允许使用新的标识符并将数据紧密地放在一起。 但是,它确实有使用大量 space.
的缺点第二种解决方案要求我们在每次需要时区时都加入时区 table - 这很常见 - 但几乎不需要 space。 如果需要,必须将新的时区标识符添加到 table。 它还引入了这些神奇的整数 ID(使用的外键),这些 ID 可能会被误认为是众所周知的标识符(我们目前有这个问题,其中 ID 已移出数据库并移入使用的代码内字典而不是数据库table).
在我写这篇文章的时候,我在想,是否有可能为 SQL 服务器创建一个自定义时区 UDT,其中时区可以作为它们的字符串标识符保存和加载, 但以用户隐藏格式更有效地存储。
虽然这两种方法都可行,但通常的做法是将 IANA 时区标识符存储为字符串。它们确实是唯一标识符,因此可以这样对待它们。 "America/Argentina/ComodRivadavia"
目前是最大的字符串,有 32 个字符 - 所以 varchar(32)
就足够了。不过,我通常使用 varchar(50)
只是为了将来安全。
您可以通过规范化查找来节省几千字节的存储空间 table 通常不值得连接的性能影响,恕我直言。但是,就像任何权衡取舍一样,您应该评估这两个选项,看看哪个更适合您的场景。使用查找 table.
不一定 错误