fsharp / dotnet和时态数据库

时间:2012-02-26 13:26:01

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

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

您是否有过与时态数据/数据库相似的经历?

你能推荐阅读/知道什么?

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

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

3 个答案:

答案 0 :(得分:1)

我认为,考虑到数据模型中捕获的现实的时间方面,应该从valid timetransaction time维度之间明确区分开始;你的例子方法与首席执行官“在某个时间点”有“CEO”状态,只有一个通用的时间维度状态“何时”可能足够好,只要你这样做不考虑细粒度时间尺度上捕获的“事实”的多个来源。否则,如果你转向在你的问题中提到股票价格及其关系,例如S& P 500指数的价值与其成分股价格之间的关系,你就无法摆脱区分这两个维度并在中捕获它们内部数据状态:S& P 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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我不确定我是否从您的描述中获得足够的信息,但听起来您希望查看Reactive Programming,其中依赖值可能随时间而变化,尤其是Functional Reactive Programming