Database design 无位置选择的CQL设计

Database design 无位置选择的CQL设计,database-design,cassandra,cql,zebus,nosql,Database Design,Cassandra,Cql,Zebus,Nosql,我们目前正在重写对等服务总线()的目录 我们有一个Cassandra/Thrift实现,必须对其进行改进以满足一些新的负载需求,因此使用CQL重写它似乎是正确的做法 我们有两个CFs,一个用于存储对等点,另一个用于存储订阅,后者是最棘手的 我们需要为每个消息类型存储一个路由键(绑定)列表,并为每个对等方存储一个消息类型列表。我们还需要能够分别更新每种消息类型的路由列表(我们使用Cassandra的时间戳来处理潜在的竞争条件,因为我们有多个目录)。最后,当有人请求对等状态时,我们需要能够列出所有这

我们目前正在重写对等服务总线()的目录

我们有一个Cassandra/Thrift实现,必须对其进行改进以满足一些新的负载需求,因此使用CQL重写它似乎是正确的做法

我们有两个CFs,一个用于存储对等点,另一个用于存储订阅,后者是最棘手的

我们需要为每个消息类型存储一个路由键(绑定)列表,并为每个对等方存储一个消息类型列表。我们还需要能够分别更新每种消息类型的路由列表(我们使用Cassandra的时间戳来处理潜在的竞争条件,因为我们有多个目录)。最后,当有人请求对等状态时,我们需要能够列出所有这些订阅

最后一点是一个问题,因为它意味着运行一个
SELECT*FROM“Subscriptions”
,这意味着列出来自多个节点的行(顺便问一下,CQL如何允许您列出底层Cassandra行?),而且速度相当慢

因此,我们的CF最终采用以下模式,将所有内容连续存储在同一Cassandra行的磁盘上,并具有良好的读取性能(我们知道,这在平衡节点之间的数据方面非常糟糕)

创建不存在的表“DynamicSubscriptions”(
“UselessKey”布尔值,
“PeerId”文本,
“MessageTypeId”文本,
“SubscriptionBindings”blob,
主键(“UselessKey”、“PeerId”、“MessageTypeId”)
);
这很难看,但却起到了作用,每个人最终都坐在同一个“储蓄行”上,导致了闪电般的阅读速度

所以我的问题是:如果我想在无约束选择过程中快速查询数据,是否有一种使用CQL设计CF的方法


(或者,如果您认为我们的设计完全有缺陷,请随意说)。

因此,据我正确理解,您应该创建这样的表格:

如果不存在动态订阅,则创建表(
对等id文本,
消息类型文本,
绑定blob,
主键(对等id、消息类型)
);
它与您的非常相似,但关键区别在于主键定义。 主键的第一列是分区键,这意味着具有相同分区键的所有数据将存储在相同的物理列族行中。其余的主键组件是集群列,用于区分和排序单个分区键中的数据

换句话说,这种模式的优点是:

  • 对等数据均匀分布在集群上
  • 您可以高效地查询对等数据(消息类型、带有绑定的消息类型),因为它们被排序并存储在单个节点上
  • 您可以在特定对等节点的上下文中高效地查询单个消息类型
  • 您可以在特定对等方的上下文中高效地更新/删除选定消息类型的绑定

我希望这会对您有所帮助。

通常会有一种方法来限制用户交互驱动的信息。这也将推动您的数据模型设计

我可以考虑的一种限制您列出订阅的对等点数量的方法是基于时间段。请注意,这需要是一个单独的CF,与您查询以获取每个对等信息的CF不同。黄金法则是一个CF驱动一个查询

假设您可以按时间限制向用户显示的对等点的数量,下一个要解决的问题是将数据分布在多个分区(旧数据行)中。您可以使用MessageType和时间组件(如day)的组合作为分区键。当您向用户显示这些数据时,您有一个自然的分页机制

总而言之,您需要Jacek L提到的CF。此外,为了显示多个对等点的信息,您可以使用类似的内容

CREATE TABLE IF NOT EXISTS peer_subscriptions (
    message_type   text,
    connection_date  text,
    peer_id   text,
    bindings  blob,
    PRIMARY KEY ((message_type,connection_date),peer_id)
);

我不确定我是否正确理解了您的数据模型-对于每个对等方,您希望存储一个消息类型列表,对于每个消息类型,您希望存储一个绑定列表,对吗?特定消息类型的绑定列表是否为每个对等方独立定义?第二个问题-是否每次都要选择所有数据?或单个对等方的数据?是的,我们希望为每个对等方单独存储特定消息类型的不同绑定。关于检索,我们希望能够为特定的对等点选择数据。不幸的是,这是我提出的第一个模式,但是没有WHERE约束的select*的性能是不可接受的,因此我的设计“丑陋化”。但是,正如您所说,您将检索特定对等点的数据,是吗?对不起,我不是很清楚,我的意思是,我需要两者,对于一个给定的同龄人和所有人。好吧,那么当你要求所有人时,你需要一次得到所有人,还是你可以做一些分页?嗯,尽可能快最好。分页是指手动执行多个查询还是使用C*2.0分页?