在后关系 (NoSQL) 数据库世界中,规范化并不是关系世界中的标准方式,因此不要害怕在多个位置写入相同的数据。
因此,在这种情况下,如果您希望能够快速找到最高值,请创建一个单独的表来保存最高值(或 k 值),并在您更新时更新它具有更大值的现有表。
针对查询优化您的表格,并根据需要调整您编写的内容。
至于键 - 我正在描绘一个表/cf,其中单行具有一个键值,例如“slowestusers”,以及该行上的一个值或一系列值。
CREATE TABLE slow_responses (
id varchar PRIMARY KEY,
slowest_response1 bigint,
slowest_response2 bigint
);
INSERT INTO slow_responses (id, slowest_response1) VALUES ('slowestusers', 1200);
INSERT INTO slow_responses (id, slowest_response2) VALUES ('slowestusers', 1301);
如果您有多个服务器更新这些值,则会出现问题,如果您需要,则必须考虑这一点。
编辑:
关于如何对此进行多服务器更新的进一步想法。一个是您可以通过使用您最喜欢的 q'ing 实现将它们放入队列中来序列化这些更新。我想到了另一种方法,然后意识到它行不通。 ;) 但当然,有选择。
编辑:
好的,也许它会起作用。另一个想法是让每个服务器写自己的行。然后,在读取时,您拉入所有行,将所有数字排序在一起,并拉出 k 个最高值。
CREATE TABLE slow_responses (
id varchar,
server varchar,
slowest_response1 bigint,
slowest_response2 bigint,
PRIMARY KEY (id, server)
);
-- server1 writes like:
INSERT INTO slow_responses (id, server, slowest_response1) VALUES ('slowestusers', 'node1', 1200);
INSERT INTO slow_responses (id, server, slowest_response2) VALUES ('slowestusers', 'node1', 1301);
-- server2 writes like:
INSERT INTO slow_responses (id, server, slowest_response1) VALUES ('slowestusers', 'node2', 800);
INSERT INTO slow_responses (id, server, slowest_response2) VALUES ('slowestusers', 'node2', 765);