【问题标题】:What's the most efficient way to store time zone info in Realm?在 Realm 中存储时区信息的最有效方法是什么?
【发布时间】:2015-05-19 12:50:12
【问题描述】:

我有一个包含NSDate 时间戳的领域对象,表示用户记录某些内容的时间。我需要为此添加时区信息,以便我知道用户创建对象时的本地时区(以便进行准确的日期格式和比较)。

Realm db 中会有很多这样的对象(每天使用应用程序时可能会创建几个),但总的来说,我认为你不能说它会是一个过大的数字(忙碌的用户可能每年使用应用程序创建几千个这样的对象)。

似乎最简单的设计是将timeZoneName 存储为字符串(NSTimeZonename 标识,例如“America/New_York”)。这将导致每个领域对象重复大约 10-20 个字符的字符串。

这只是几个可能的字符串值的大量重复。我应该费心尝试优化吗?例如,拥有一个单独的 TimeZoneInfo 领域实体,该实体将具有一个用于时区名称的属性,并确保每个时区只有一个这样的实体。

澄清

让我提出一个更客观的问题。什么会在 Realm 数据库中占用最少的空间?

选项1:

具有存储 NSTimeZone 的 name 的 String 属性的实体。此名称值的平均长度为 15 个字符。该实体可能有数千个实例。

选项 2:

EntityA 具有存储 NSTimeZone 的 name 的 String 属性。只会有几个实例(名称是唯一值)。 EntityB 引用 EntityA(它具有 EntityA 类型的属性)。 EntityB 的实例可能有数千个。

基本上,存储数千个字符串还是存储数千个实体引用更有效?

【问题讨论】:

  • 从 GMT 偏移的分钟数,我想。如果您只想要正确的时间,那么知道时间记录在哪个国家并不重要。或者以格林威治标准时间记录所有时间。
  • 好主意,但我确实希望能够重新创建一个“完整的”NSTimeZone 对象,并具有适当的abbreviation 值,以便在屏幕上显示。使用timeZoneForSecondsFromGMT 重新创建 NSTimeZone 时,我无法获得所有这些信息。
  • 好的,保存缩写就是这样。但是,正如您所说,每个 NSTimeZone 对象都有 1+ 个缩写,因此应该从记录时间的设备中获取,而不是从 NSTimeZone 对象中获取。
  • 我多次阅读第一段,但我仍然不明白为什么需要存储时区。您无需知道时区即可进行准确的日期格式设置和日期之间的比较。 NSDate 的工作方式是保存参考日期和时间的秒数。因此,如果一个用户的时间是下午 1:00,然后 5 分钟后另一个用户保存一个日期并且他的本地时间是上午 8:05,这并不重要。系统以它知道它们之间只有 5 分钟差异的方式保存日期。如果你在它们之间进行比较,它会起作用。
  • @pteofil 我需要格式化日期,并根据创建对象时使用的时区按日历日期分组。例如,用户可以在当地时间 2015 年 5 月 19 日 23:30 录制事件。然后一周后,用户向东飞行三个时区并查看该数据。它仍应显示“2015-05-19 23:30”,即使该绝对 NSDate 值将使用当前设备时区格式化为“2015-05-20 02:30”。因此,我需要了解每个对象的原始时区。

标签: ios macos nsdate realm foundation


【解决方案1】:

选项 2 将使用更少的空间,但在您的情况下,差异可能不值得关心。

如果有 5000 个条目和选项 1,您将查看 160KB 的字符串数据(对于短字符串,对于每个数据块中的 O(1) 索引,存储大小向上舍入到 2 的幂),加上几百字节的数据结构开销。如果存储缩写就足够了,那么您将需要 20KB 的字符串数据和类似数量的开销。使用选项 2,您只需拥有唯一的字符串数据加上每个条目 1 个字节(假设用户不会访问大量时区)。

【讨论】:

  • 我同意在这种情况下进行优化是不值得的。你是说实体之间的一对一引用每个条目只需要一个字节?
  • 引用只是目标的行索引,整数使用存储任何条目最大值所需的最小宽度存储。因此,如果目标对象不超过 256 个(或仅链接到前 256 个),则每个链接仅使用一个字节来存储它链接到的行。
  • 有趣。感谢您提供详细信息。
  • 嗯,优化的规则,总是衡量你是否真的需要它。我会选择选项 2,不是因为它应该使用更少的空间(无论如何这可能是微不足道的),而是因为它遵循我们在数据库中存储对象时使用的相同模式。您拥有一个对象和对它的许多引用,而不是同一对象的无数副本。
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 2021-06-30
  • 2010-11-09
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 2016-11-07
  • 2018-03-06
相关资源
最近更新 更多