假设我们有一个聊天室。每个聊天室都有几个参与者。就我而言,它是一个客户和几个运营商(1 个或多个)。此外,每个聊天室都有自己特定的主题。正如我们在Cassandra数据库中所知道的,需要根据查询来设计表。
假设我有这样的疑问:
- 获取所有尚未有操作员的开放聊天室的列表。
- 获取具有特定操作员的所有打开聊天的列表。
- 获取尚未有操作员的特定主题的所有打开聊天室列表。
- 获取具有特定操作员的特定主题的所有打开聊天列表。
我知道非规范化对于 Cassandra 来说是正常的。但是,我是否需要为所有这些查询创建单独的表?我还想知道如何检查一个值是否包含在SELECT
查询列表中?如您所见,operators
在我的案例中,该列具有list
数据类型。
在这个特定的时刻,对于前两个查询,我创建了下表:
CREATE TABLE IF NOT EXISTS "chat_rooms" (
room_id uuid,
created_at timestamp,
updated_at timestamp,
client varchar,
operators frozen list<varchar>,
last_message text,
unread_message_number int,
is_open boolean,
theme varchar,
PRIMARY KEY (
(is_open, operators),
updated_at
)
) WITH CLUSTERING ORDER BY (updated_at desc);
对于第三个和第四个查询,我只是更改了分区键并添加了theme
列。这有多正确?