【问题标题】:fsharp / dotnet and temporal databasefsharp / dotnet 和时态数据库
【发布时间】:2012-02-26 13:26:01
【问题描述】:

我正在寻找一种方法,将时间意识尽可能直接地整合到我的课程中。我处理的是随时间变化很大的数据,比如股价,所以这可能需要一些关注,并在一个地方处理以确保“关注点分离”。

您在时态数据/数据库方面有过类似经验吗?

你推荐阅读/了解什么?

(我正在考虑将我的计算包装在 TimeSlice(date) 计算表达式构建器中,以便将检索范围限定到构成我计算的“范围”的指定日期。 喜欢

let oldCEO = 
      historicaDate(Today() - 10 years)            {
          let! company = CompanyFinder("MSFT")
          company.CEO 
        }
let todayCEO = 
      historicaDate(Today() )            {
          let! company = CompanyFinder("MSFT")
          company.CEO 
        }

【问题讨论】:

  • 你到底是什么意思?你能发布你想象的表达方式吗?
  • 我希望它是 (historicalDate (Today() - 10 years)) { .. }return company.CEO

标签: f# temporal temporal-database computation-expression


【解决方案1】:

我认为,考虑在您的数据模型中捕获的现实的时间方面应该首先明确区分 valid timetransaction time 维度;您的 CEO 示例方法“在某个时间点”具有 “CEO” 状态并仅伴随一个通用时间维度状态 “When”,只要您这样做就足够了不要考虑在细粒度时间尺度上捕获的“事实”的多个来源。否则,如果您在问题中提到股价及其关系的问题,例如标准普尔 500 指数的价值与其成分股价格之间的关系,您就无法避免区分这两个维度并在您的内部数据中捕获它们状态:标准普尔500指数的价值仅对某些交易时间有意义,因为您需要在某个有效时间时刻收集成分价格并执行(非瞬时)加权和计算以得出指数价值在稍后的某个交易时间时刻,这实际上是有效时间过去时刻的价值。

或者,即使停留在您的示例中,假设某个合规团队要求您随时审核过去某个时刻您的反应是什么。换句话说,你的时间说明符

historicalDate(date: <time expression>)

是更通用案例的特定变体

historicalDate(date: <valid time expression>,
               asOf: <transaction time expression>)

所以historicalDate(Today() - 1yr) 实际上是 historicalDate(Today() - 1yr, Now()),但原则上可能是 historicalDate(Today() - 1yr, Now() - 20days)

按时间处理数据并不是一件简单的事情,不能简单地给出一个简短的通用方法来通过计算表达式等特定语言机制来驯服它。做一些阅读绝对是个好主意。如果被问到我可能会推荐哪一本书,我的回答是Managing Time in Relational Databases,否则如果你想进行详尽的研究,你也可以考虑经典 Developing Time-Oriented Database Applications in SQLTemporal Data & the Relational Model

也许其他人可以向您指出在基于关系的持久性机制之外处理时间数据状态的方法,但我自己的经验仅限于此。

【讨论】:

  • 确实如此。 “价值”日期和“水平”日期不一样。这个问题是一个非常根本的问题。一旦我们处理数据,我们就会以一种或另一种方式面对它。感谢我正在调查的链接。
  • @nicolas:在时间数据域中,“地平线”日期通常意味着与“交易”日期完全不同的东西,即未来时间点。例如,通常具有一年期限的“股票目标价格”是从现在起一年内股票的预测价格。为了避免混淆,最好坚持使用既定术语,对于现实时间维度有效,对于模型一交易
  • 我不知道这个术语。在金融领域,我认为既定的成语将是“历史”日期。并且股票目标价格将有一个相关的日期,您可以将其称为到期日、期限或支柱日。对我自己来说,我觉得地平线这个词已经足够描述了,如果你认为地平线是你看不到的地方,因为它太远了。这种使用是空间中现有概念在时间上的直接类比。
  • 当然 Horizo​​n 与数据的“使用”有关,而不是数据本身,但是这两个概念是有约束力的:对于给定的 Horizo​​n 日期,您可以访问所有交易日期为低于地平线日期
【解决方案2】:

阅读您的问题后,我想起了 Clojure 发明者的 Datomic 数据库,它明确地“是一个灵活的、基于时间的事实的数据库,支持查询和连接”。 http://www.datomic.com/ 也许那里的想法会激发你的 F# 思维,就像我的一样。

【讨论】:

    【解决方案3】:

    我不确定我是否从您的描述中得到足够的信息,但听起来您想查看 Reactive Programming,其中的依赖值可能会随着时间而变化,尤其是像 Functional Reactive Programming 这样的东西。

    【讨论】:

    • 哦,不,请不要给我另一个借口来挖掘另一个很酷的 FP 概念!我受够了! ;) 谢谢,我会调查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2023-03-27
    • 2023-04-10
    相关资源
    最近更新 更多