【问题标题】:Optimal DB structure for creating user segments用于创建用户细分的最佳数据库结构
【发布时间】:2017-08-09 20:13:34
【问题描述】:

我想创建一个分段引擎,但似乎无法找出用于该任务的最佳数据库或数据库结构。 目前我使用 MySQL 作为我的主数据库,但分段引擎是一个单独的软件组件,因此如果适用,可以有不同的数据库。

基本上,我有 1000 万个使用 UserID(整数)标识的唯一用户。分段引擎的管理员使用一些预定义的规则(如年龄范围、地理位置、交易历史等)动态创建分段。应用程序应该定期(每 15 分钟一次)执行每个段的规则,以获取属于该段的所有用户(每个最多 100 万个用户)的当前列表并存储它。

后来的应用程序公开了 API 以允许外部系统使用分段功能,即: 1. 获取特定 UserID 所属的所有段的列表。 2. 获取特定段包含的所有 UserID 的列表。

请注意,由于段需要非常频繁地更新(每 15 分钟一次),这会导致数据库中的大量事务来“维护”这些段,其中不适用的用户应该被删除并一直添加新用户。

到目前为止,我已经考虑了几种方法: 1. 普通的 MySQL,我有一个属于段的用户表(SegmentID,UserID)。 (这种方法有两个缺点:存储空间和 MySQL 中的不断删除/插入/更新,这将通过引入页面拆分降低 innodb 性能。

  1. 在 MySQL 中使用 JSON 数据类型,其中我可以有表 (UserID,Segments),其中段是包含 SegmentID 数组的 json。 (这里的缺点是搜索慢、更新慢)

  2. 将 Redis 与 Sets (UserID,Segments) 一起使用,其中 UserID 将是键,Segments 将是 SegmentID 的集合。 (这里的缺点是没有简单的方法来通过 SegmentID 进行搜索)。

有没有人从事过类似的任务并可以提供任何指导? 任何反馈都将不胜感激,因此我可以指出我可以进一步研究的方向。

【问题讨论】:

  • 问题不清楚。我无法想象除了大量新用户进入数据库之外,用户群快速变化的情况。
  • 假设有一部分用户在过去 24 小时(滚动期)内进行了 10 次交易。这部分会一直变化。另一个示例可能是在过去 24 小时(滚动期)内从移动设备登录 5 次的用户群。

标签: mysql database search redis nosql


【解决方案1】:

我认为你可以使用Elasticsearch 来完成这项任务。

【讨论】:

  • ElasticSearch 存储由 100,000 个元素组成的多值字段的优化程度如何?在维护(其中单个值的不断插入/更新/删除)和索引方面?
  • 抱歉,我不是 ElasticSearch 方面的专家,我是软件架构师。我确信它可以。但最好在这里提出另一个关于 ElasticSearch 的问题。
  • 按照你上面的评论你可以看看 Hive 和时间序列数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多