【问题标题】:Merging data from different sources with different types合并来自不同来源的不同类型的数据
【发布时间】:2016-05-10 12:20:19
【问题描述】:

我有四个通过公共 ID(递增整数)关联的数据源。

一个数据源 P 始终可用,而其他三个 L 可能对给定 ID 可用,也可能不可用(即不保证 ID 存在),并且通过 Internet 接收并通过以下方式区分他们的 IP 地址。

我在一段时间内收集数据源,然后我想使用他们的 ID 加入它们。

我的心智模型是这样的

  • 来自P区间P: List<'T>的数据
  • 来自所有L 来源的数据:L: List<Dictionary<string, 'U>>
  • 从源Pa: 'T -> int获取ID
  • 从L源b: 'U -> int获取ID
  • 合并数据的结果类型'V = {Id: int; P: 'T; L: Dictionary<string, 'U> }
  • 结果R: List<'V>

在我使用哈希集和诸如此类的东西运行 amok 之前,最好能获得一些关于如何做到这一点的想法。也许有一些很酷的 F# 功能可以让这变得非常简单。

【问题讨论】:

  • 这个问题并不完全清楚 - 您写道 Ls 可能对给定 ID 可用,但您从 L 获取 ID 的调用由 'U 键入?
  • @AntonSchwaighofer 是的,来自L 源的数据都属于同一类型,'U,并假定包含 ID。 a 和 b 从数据类型 'T 和 'U 中提取 ID。
  • 如果我假设您的意思是a: int -> 'T,并且相应地对于b,我宁愿将其建模为{ Id: int; P: 'T; L: Map<string,'U option>}。我不明白您为什么需要字典列表?
  • @AntonSchwaighofer 你是对的。结果类型中的字典列表是错误的。该列表位于R 中。更新了 Q。

标签: f#


【解决方案1】:

我认为您可以更直接地将域模型转换为 F# 中的类型。

一个数据源 P 始终可用,其他三个 L 可能或 给定 ID 可能不可用(即不保证 ID 存在)并通过 Internet 接收,并且可以通过以下方式区分 他们的 IP 地址。

这很好地描述了 F# 中的记录类型。

type MyDataSources = 
    {Id: int;
     P : MyDataSource;
     L1: MyOtherDataSource option;
     L2: MyOtherDataSource option;
     L3: MyOtherDataSource option;}

我在一段时间内收集数据源,然后我想 使用他们的 ID 加入他们。

因此,我们需要另一种数据记录类型。

type JoinedData<'T, 'U> =
    {PData : 'T list;
     L1Data : 'U list option;
     L2Data : 'U list option;
     L3Data : 'U list option;}

然后我们只需要一个获取数据源并填充数据的函数。

let populateDataFromSources dataSources =
    {PData = getDataFrom dataSources.P // replace with whatever logic you want here
     ....
    }

如果需要,您的getDataFrom 函数可以将您的数据源中的Id 作为参数并过滤与该Id 相关的返回数据(例如)。

【讨论】:

  • 我很欣赏这里的逻辑,但在我看来,合并的问题被推迟到了populateDataFromSources。我在想也许有一个很好的方法来left join 源,这样我就不必从头开始编写合并。
  • @kasperhj 您可以使用上述方法强烈引用数据源,您不需要任何基于Id 的复杂连接/合并。在绝对最坏的情况下,数据源返回的数据适用于多个Ids,这种情况下你唯一需要的逻辑是filter。
  • 但是你将如何构造MyDataSources? P has 和 id 必须与 Lx 匹配。
  • 事实证明,您的方法可以与代理相结合,呈现出相当优雅的解决方案。不错!
猜你喜欢
  • 2017-02-23
  • 2020-09-25
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多