尝试为我们的场景定义正确的模式/表:我们有数百个电子商务站点,每个站点都有唯一的siteId
.
每个站点都有自己的最终用户,每月最多 1000 万独立用户。每个用户都有独特的userId
.
每个最终用户都与网站交互:查看产品、将产品添加到购物车和购买产品(我们称之为用户事件)。我想存储过去 30 天(或 180 天,如果可能)的活动。
需要考虑的事项:
- 网站大小不一样!我们有一些拥有 1000 万最终用户的“重度”网站,但我们也有拥有数百/数千用户的“轻量”网站。
- 事件没有唯一的 ID。
- 用户一次可以有多个事件,例如,他们可以查看包含多个产品的页面(但我们可以不受限制以简化)。
- 粗略估计:100 个客户 x 10M 最终用户 x 100 次交互 = 100,000,000,000 行(每月)
- 实时写入(当事件到达服务器时)。读取完成的次数要少得多(1% 的事件)。
- 事件有更多的元数据,不同的事件(查看/购买/..)有不同的元数据。
- 使用 Keyspace 在站点之间进行分隔,并管理每个站点的表与一张表中的所有客户。
如何在这里定义密钥?
+--------+---------+------------+-----------+-----------+-----------+ | siteId | userId | timestamp | eventType | productId | other ... | +--------+---------+------------+-----------+-----------+-----------+ | 1 | Value 2 | 1501234567 | view | abc | | | 1 | cols | 1501234568 | purchase | abc | | +--------+---------+------------+-----------+-----------+-----------+
我的查询是:获取特定用户的所有事件(及其元数据)。正如我上面假设的那样,大约有 100 个事件。
Edit2:我想不清楚,但是用户的唯一性是每个站点,如果两个不同的用户在不同的站点上,他们可能具有相同的 id