fsharp/dotnet и временная база данных

Я ищу способ как можно более непосредственно интегрировать временное осознание в свои занятия. Я имею дело с данными, которые довольно сильно меняются со временем, например с ценами на акции, поэтому, вероятно, это потребует некоторого внимания и обработки в одном месте, чтобы обеспечить «разделение интересов».

Был ли у вас подобный опыт работы с временными данными/базами данных?

Что бы вы могли порекомендовать прочитать / узнать?

(Я думаю о том, чтобы обернуть свои вычисления вокруг построителя вычислительных выражений TimeSlice (дата), чтобы ограничить поиск до указанной даты, которая составляет «горизонт» моих вычислений. например

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

person nicolas    schedule 26.02.2012    source источник
comment
Что именно ты имеешь ввиду? Можете ли вы опубликовать, как бы вы представили выражение?   -  person svick    schedule 26.02.2012
comment
Я ожидаю, что это будут (historicalDate (Today() - 10 years)) { .. } и return company.CEO.   -  person Ramon Snir    schedule 26.02.2012


Ответы (3)


Я считаю, что рассмотрение временного аспекта реальности, отраженного в вашей модели данных, должно начинаться с очень четкого различия между действительным временем и время транзакции; ваш пример подхода с генеральным директором «в определенный момент времени», имеющим состояние «генеральный директор», сопровождаемое только одним общим состоянием временного измерения когда», может быть достаточно хорошим, пока вы это делаете не рассматривайте несколько источников ваших захваченных «фактов» в мелких масштабах времени. В противном случае, если вы обратитесь к упомянутому в вашем вопросе вопросу о ценах акций и их взаимосвязях, например, между значением индекса 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)

Битемпоральная работа с данными не настолько проста, чтобы дать краткий универсальный рецепт по ее укрощению с помощью конкретных языковых механизмов, таких как вычислительные выражения. Определенно было бы неплохо немного почитать. Если меня спросят, какую книгу я могу порекомендовать по этому вопросу, мой ответ будет Управление временем в реляционных базах данных, в противном случае, если вы хотите исчерпывающего исследования, вы также можете рассмотреть классический Разработка приложений баз данных, ориентированных на время, в SQL и Временные данные и реляционная модель.

Возможно, кто-то еще может указать вам на подходы к обработке состояния временных данных вне реляционного механизма персистентности, но мой собственный опыт ограничен только такими.

person Gene Belitski    schedule 26.02.2012
comment
Верно. Дата «валюации» и «горизонт» не совпадают. Эта проблема является достаточно фундаментальной. Как только мы имеем дело с данными, мы так или иначе сталкиваемся с ними. Спасибо за ссылки, изучаю. - person nicolas; 26.02.2012
comment
@nicolas: В домене временных данных дата «горизонт» обычно означает нечто совершенно отличное от даты «транзакции», а именно будущий момент времени. Например, целевая цена акции, обычно имеющая дату горизонта в один год, является прогнозируемой ценой акции через год. Во избежание путаницы всегда лучше придерживаться установленной терминологии, которая действительна для измерения времени реальности и транзакции для модели. - person Gene Belitski; 26.02.2012
comment
Я не знал этой терминологии. в финансах я думаю, что устоявшейся идиомой для этого была бы «историческая» дата. и целевая цена акции будет иметь связанную дату, которую вы бы назвали датой погашения, сроком или датой опоры. Для себя я нахожу термин «горизонт» достаточно описательным, если вы думаете о горизонте как о месте, после которого вы не можете видеть, потому что оно слишком далеко впереди. это использование является прямой аналогией во времени существующей концепции в пространстве. - person nicolas; 27.02.2012
comment
Конечно, горизонт относится к «использованию» данных, а не самих данных, но два понятия связаны: для данной даты горизонта у вас есть доступ ко всем событиям, дата транзакции которых ниже даты горизонта. - person nicolas; 27.02.2012

Читая ваш вопрос, я вспомнил базу данных Datomic от изобретателя Clojure, которая явно «представляет собой базу данных гибких, основанных на времени фактов, поддерживающих запросы и соединения». http://www.datomic.com/ Возможно, идеи, представленные там, будут стимулировать ваше мышление на языке F#, как и мое.

person Alan Wostenberg    schedule 02.01.2014

Я не уверен, что получил достаточно из вашего описания, но похоже, что вы хотите изучить реактивное программирование, где зависимые значения могут меняться со временем, в частности что-то вроде Функциональное реактивное программирование.

person lysium    schedule 27.02.2012
comment
о нет, пожалуйста, не давайте мне еще один повод копаться в другой классной концепции FP! У меня их достаточно! ;) Спасибо, буду разбираться. - person nicolas; 28.02.2012