【发布时间】:2015-04-09 08:23:11
【问题描述】:
所以我正在设计这个用于产品价格跟踪的数据模型。
一个产品可以被很多用户关注,一个用户可以关注很多产品,所以这是多对多的关系。 产品一直处于跟踪状态,但只有在与之前的价格不同时才会插入新价格。
用户为其关注的产品设置了价格上限,因此每次价格变化时,都会检查偏好,如果价格低于他们的阈值,则会通知用户。
所以一开始我想到了以下产品模型:
但是,“subscriberEmails”是一个列表集合,最多可以处理 65536 个元素。但作为一个大数据解决方案,这是我们不希望拥有的边界。所以我们最终为此编写了一个单独的表:
所以现在“usersByProduct”可以拥有多达 20 亿列,这很公平。并且用户偏好存储在“地图”中,该地图再次受到限制,但我们认为这是用户可以关注的最大产品数量。
现在我们面临的问题是:
每次我们想要更新产品的价格时,我们都必须进行如下查询:
INSERT INTO products("Id", date, price) VALUES (7dacedd2-c09b-46c5-8686-00c2a03c71dd, dateof(now()), 24.87); // Example only
但是 INSERT 操作不接受除 (IF NOT EXISTS) 之外的其他条件子句,这不是我们想要的。只有当价格与前一个不同时,我们才需要更新价格,因此这迫使我们进行两次查询(一个用于读取当前值,另一个用于在必要时更新它)。
PD。 UPDATE 操作确实有 IF 条件,但这不是我们的情况,因为我们需要一个 INSERT。
UPDATE products SET date = dateof(now()) WHERE "Id" = 7dacedd2-c09b-46c5-8686-00c2a03c71dd IF price != 20.3; // example only
【问题讨论】:
-
只是好奇,但为什么需要
INSERT?在后台,UPDATE和INSERT是相同的:stackoverflow.com/questions/28350630/… -
因为即使我进行了所有操作更新,我仍然必须提供时间戳(在主键中)来插入某个产品价格。在给定时间插入新价格时,数据库中不存在新时间,因此更新操作将始终被视为插入(并且不会检查最后插入的价格是否相同)。
-
另外,你不想这样做:
dateof(now())。DateOf返回一个时间戳,但now返回一个 timeuuid,它们具有不同的精度。这意味着您的数据将具有时间戳的外观,但实际上将存储从now()生成的 timeuuid,这使您难以按日期范围查询(如果您打算这样做):stackoverflow.com/questions/26237940/… -
好点,按日期范围查询是必需的,谢谢!
标签: cassandra cql cassandra-2.0 cql3 datastax