如何对聚合的 1:N 关系建模?

问题描述

我想将一系列事件放入 Clickhouse,它们通过 id 字段关联到单个实体。每个事件类型都有实体的不同部分,大多数事件类型发生一次,但有些事件发生多次。我试图弄清楚如何对此进行建模,以便表中有一行(在 OPTIMIZE 之后)来表示该实体(即使每个实体有多个事件)。

我的数据是这样的,其中事件 D 是可以多次发生的事件:

Event type A:
{
  "id": <string identifier>,"a": <data for field a>
  "aa": <data for field aa>
}

Event type B:
{
  "id": <string identifier>,"b": <data for field b>,"bb": <data for field bb>
}

Event type C:
{
  "id": <string identifier>,"c": <data for field c>,"cc": <data for field cc>
}

Event type D:
{
  "id": <string identifier>,"d": <data for field d>,"dd": <data for field dd>
}

我希望 Clickhouse 中的表格看起来像这样:

CREATE TABLE events
(
  id String,a Nullable(String),aa Nullable(String),b Nullable(String),bb Nullable(String),c Nullable(String),cc Nullable(String),d Nullable(Array(String)),dd Nullable(Array(String))
)

其中列 ddd 的元素的顺序相同,例如d[1]dd[1] 应该来自事件 D 的同一实例。

我遇到的问题是想出一个正确的引擎来给我这个。我很自然地为此去了 AggregatingMergeTree 并使用 id 作为排序键,但我不知道如何聚合来自事件 D 的字段。我认为这可能是因为明显缺乏将值聚合到该类型数组中的聚合函数(例如,将 Nullable(String) 聚合到 Array(String) 中)。

是否有这样的函数或表引擎可以完成我正在尝试做的事情,或者我是否正确地考虑了这一点?我意识到我可以将 D 事件写入单独的表,但我想尽可能避免连接。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)