我是 Cassandra 的新手,我在尝试弄清楚如何订购数据时遇到了困难。我正在尝试为每个主播录制来自 twitch.tv 的消息。我想要类似下面的东西
CREATE TABLE IF NOT EXISTS chat_data.twitch_chat_by_broadcaster_and_timestamp (
broadcaster_id int,
timestamp int,
message text,
PRIMARY KEY (broadcaster_id, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);
虽然对于业余爱好项目来说这不是问题,但如何解决同时发送两条消息的问题。我知道
TimeUUID
,但我希望消息按发送时的时间戳排序,而且除了 TimeUUID
之外,似乎没有任何官方方法可以创建 now()
。
我设想使用此数据库来获取给定流的给定时间范围内的所有消息。我意识到我可以添加另一个
UUID
字段来保证唯一性,但这会搞砸我的查询,因为我必须指定准确的时间。
对这些数据进行排序以实现高效查询的正确方法是什么?
我意识到我可以添加另一个 UUID 字段来保证唯一性,但这会搞砸我的查询,因为我必须指定准确的时间。
如果您将其添加为最后一个聚类列,则不会:
CREATE TABLE IF NOT EXISTS chat_data.twitch_chat_by_broadcaster_and_timestamp (
broadcaster_id int,
timestamp int,
message_id uuid,
message text,
PRIMARY KEY (broadcaster_id, timestamp, message_id)
) WITH CLUSTERING ORDER BY (timestamp DESC, message_id ASC);
这样,您可以在写入时简单地生成一个新的 UUID。只要通过
broadcaster_id
的分区键查询,数据仍然会按(两者)timestamp
排序,并添加message_id
以确保唯一性。
据我所知,
broadcaster_id
对消息的查询没有改变:
> SELECT * FROM twitch_chat_by_broadcaster_and_timestamp WHERE broadcaster_id=68;
broadcaster_id | timestamp | message_id | message
----------------+---------------+--------------------------------------+---------------------------
68 | 1705328231991 | ac74c7ba-1813-4b75-b873-8817c6f89a55 | End of stream.
68 | 1705328230499 | 0e2116d5-887c-4433-b9cc-e5c13534902d | Next stream coming soon.
68 | 1705327984482 | 01c52a3a-c1c3-4db4-b8a8-6f9fe3111911 | Incoming messages!
68 | 1705327983581 | 7a3c2444-5746-4928-9e6a-0ebaac7fbec5 | Next stream starting soon