【问题标题】:Storing Date Components Instead of a Date存储日期组件而不是日期
【发布时间】:2019-12-03 03:56:58
【问题描述】:

我的应用可以让人们记录他们看过的电影(例如)。每个记录的电影通常(但不总是)有一个日期,有时有一个时间。有一个但没有另一个并不罕见。有时日期只有一年(“我在 1984 年的某个时候看过 Dumbo”),但实际上可能是日/月/年/时间的任意组合。

我习惯于在我的应用程序和后端将日期建模为日期对象。但是单独存储每个组件是一种可行的方法吗?当我需要从组件中引用实际日期时(例如,用于对日志进行排序),这将在客户端构建,或者可能存储为派生属性 sortDate 并在任何组件发生更改时更新。

我的保留是,用户保存的信息确实是“及时”,我必须自己处理一些事情 - 例如,我的组件相对于哪个时区存储?这将作为真实 Date 对象的一部分自动捕获。

替代方法似乎是为缺少的组件假设某种“默认”(例如,如果没有年份,则为 0000 年,如果没有时间,则为时间 00:00)。但是这些默认值是有意义的,我无法将它们与“未提供”区分开来。

这种方法有哪些限制和/或陷阱?有没有人有过这样建模日期的经验?

如果有任何后果,我的应用程序是用 Swift 编写的 iOS 应用程序,并使用 Parse Server 后端。

【问题讨论】:

  • 不确定这是个好主意(恕我直言)。设计一系列结构可能会更好,这些结构提供您需要的功能并且能够提供Date 值或(如果您愿意)DateComponents 或者,可能更好的是一些生成可展示值的方法(即String
  • 我认为这或多或少是我提议的——在 iOS 中,我们有 DateComponents 可以选择存储任何此类组件,或者任何可以为零。如果我错过了你的观点,请告诉我 - 我不是 100% 正确理解“一系列结构”。
  • 恕我直言,我会避免将 DateComponents 作为“存储”机制,而是依赖一个或多个可以更可靠地描述数据的结构。例如“年份”、“日期”和“日期和时间”,您可以围绕它们做出更好、更多、明确的决定——但这只是我
  • 啊,我使用“日期组件”来表示“日期的组件”,而不是专门使用 DateComponents。是的,一个专门构建的容器可能是实现。
  • 啊,对不起我的困惑????????

标签: ios swift design-patterns database-design model


【解决方案1】:

我已经成功地使用问号来表示法律系统中模棱两可和未知的时间戳部分。请记住,您实际上不是在这里建模日期(“1984”不是日期);您正在模拟有关日期的事实。

因此,如果您的一个用户在 1984 年的某个时间看过一部电影,您可能会记录值 '1984-??-?? ??:??:??'在数据库的文本列中。像这样的价值观是明智的。

See also this answer on dba。对该答案的评论也很值得阅读。

【讨论】:

  • 这是一个很好的表达方式——我不是在模拟一个真实的日期(一个时间点)。感谢您的链接。我现在正在使用单独的整数组件测试一个版本,因为无论如何我都不会直接显示存储的值 - 如果没有日期组件,我将显示诸如“2000 年 9 月”之类的内容。
猜你喜欢
  • 2019-12-02
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多