数据中的单个与多个 ID 列 warehouse/lake
Single vs. multiple ID columns in data warehouse/lake
我已经使用 AWS Firehose -> S3/Glue -> Athena 堆栈设置了时间序列/事件数据库。它被用于跟踪我们许多产品的各种用户操作——会话启动、执行的操作等。我的问题是关于如何最好地在此系统中存储不同类型的 ID。
现有架构是一个很大的 'fact table',包含许多不同的列。最重要的两列是 event_type_id 和 object_id。以 Whosebug 为例,两个事件可能是:
- question_asked - 在这种情况下,我会将问题 ID 存储在 object_id 列中。
- tag_created - 在这种情况下,我会将标签 ID 存储在 object_id 列中。
我的问题是 - 在同一列中存储多种不同类型的 ID 是不好的做法吗?目前它对我们来说工作正常,但它确实需要 person/system 执行查询以了解 object_id 列引用的对象类型,基于他们正在查询的事件。
如果做法不好,还有哪些其他方法可能更好?如果与该行中的事件不相关,它们是否为 NULL 的多个列?或者这是维度表更适合的地方?
这不一定是不好的做法,具体取决于您的使用方式。
听起来您已经意识到这种方法的潜在缺陷(即数据的用户必须了解上下文 - 在本例中 "event type" - 才能正确使用这些值),因此,当您使用 Athena 时,您可以通过为不同的事件类型在源 table 上创建视图、在事件类型上插入 WHERE 子句过滤器并可能重命名 object_id[=20 来缓解这种情况=] 到更具体的上下文,例如question_id。
这使用户可以更轻松地处理数据并准确了解他们正在处理的值。
在大数据环境中,如果可以避免,我不建议创建维度 table,因为 table 之间的 JOIN 开始变得昂贵。为不同的 ID 使用多个列是可能的,但这会给用户带来新的问题,例如必须考虑 Id 列中的 NULL 值,这也可能使添加新事件类型和 ID 变得更加困难,因为您必须更改架构容纳他们。
我已经使用 AWS Firehose -> S3/Glue -> Athena 堆栈设置了时间序列/事件数据库。它被用于跟踪我们许多产品的各种用户操作——会话启动、执行的操作等。我的问题是关于如何最好地在此系统中存储不同类型的 ID。
现有架构是一个很大的 'fact table',包含许多不同的列。最重要的两列是 event_type_id 和 object_id。以 Whosebug 为例,两个事件可能是:
- question_asked - 在这种情况下,我会将问题 ID 存储在 object_id 列中。
- tag_created - 在这种情况下,我会将标签 ID 存储在 object_id 列中。
我的问题是 - 在同一列中存储多种不同类型的 ID 是不好的做法吗?目前它对我们来说工作正常,但它确实需要 person/system 执行查询以了解 object_id 列引用的对象类型,基于他们正在查询的事件。
如果做法不好,还有哪些其他方法可能更好?如果与该行中的事件不相关,它们是否为 NULL 的多个列?或者这是维度表更适合的地方?
这不一定是不好的做法,具体取决于您的使用方式。
听起来您已经意识到这种方法的潜在缺陷(即数据的用户必须了解上下文 - 在本例中 "event type" - 才能正确使用这些值),因此,当您使用 Athena 时,您可以通过为不同的事件类型在源 table 上创建视图、在事件类型上插入 WHERE 子句过滤器并可能重命名 object_id[=20 来缓解这种情况=] 到更具体的上下文,例如question_id。
这使用户可以更轻松地处理数据并准确了解他们正在处理的值。
在大数据环境中,如果可以避免,我不建议创建维度 table,因为 table 之间的 JOIN 开始变得昂贵。为不同的 ID 使用多个列是可能的,但这会给用户带来新的问题,例如必须考虑 Id 列中的 NULL 值,这也可能使添加新事件类型和 ID 变得更加困难,因为您必须更改架构容纳他们。