为什么在Cassandra表中使用复合聚集键?

为什么在Cassandra表中使用复合聚集键?,cassandra,data-modeling,bigtable,compound-key,Cassandra,Data Modeling,Bigtable,Compound Key,为什么要在cassandra表中使用聚集索引 比如,;在这样的表格中: CREATE TABLE blah ( key text, a text, b timestamp, c double, PRIMARY KEY ((key), a, b, c) ) CREATE TABLE customerDCProducts ( customerid text, dcid text, productid text, productname text, produ

为什么要在cassandra表中使用聚集索引

比如,;在这样的表格中:

CREATE TABLE blah (
  key text,
  a text,
  b timestamp,
  c double,
  PRIMARY KEY ((key), a, b, c)
)
CREATE TABLE customerDCProducts (
  customerid text,
  dcid text,
  productid text,
  productname text,
  productPrice int,
  PRIMARY KEY (customerid, dcid, productid));
SELECT * FROM latestTemperatures 
WHERE weatherstationid='1234ABCD';
聚集部分是
主键的
a、b、c
部分


有什么好处?有哪些注意事项?

集群键主要做三件事

1) 它们会影响表的可用查询模式

2) 它们决定表的磁盘排序顺序

3) 它们决定主键的唯一性

假设我运行一个订购系统,并希望在我的网站上存储产品数据。此外,我有几个配送中心,以及客户合同定价。因此,当某个客户在我的网站上时,他们只能访问以下产品:

  • 在其地理区域的配送中心(DC)中提供

  • 在他们的合同中定义(因此他们不一定能够访问DC中的所有产品)

为了跟踪这些产品,我将创建一个如下表:

CREATE TABLE blah (
  key text,
  a text,
  b timestamp,
  c double,
  PRIMARY KEY ((key), a, b, c)
)
CREATE TABLE customerDCProducts (
  customerid text,
  dcid text,
  productid text,
  productname text,
  productPrice int,
  PRIMARY KEY (customerid, dcid, productid));
SELECT * FROM latestTemperatures 
WHERE weatherstationid='1234ABCD';
对于本例,如果我想在DC 1138中看到客户B-26354的产品123,我可以使用以下查询:

SELECT * FROM customerDCProducts
WHERE customerid='B-26354' AND dcid='1138' AND productid='123';
也许我想看看DC 1138中针对客户B-26354提供的产品:

SELECT * FROM customerDCProducts 
WHERE customerid='B-26354' AND dcid='1138';
SELECT * FROM customerDCProducts 
WHERE customerid='B-26354';
也许我只想看到客户B-26354的所有DCs中的所有产品:

SELECT * FROM customerDCProducts 
WHERE customerid='B-26354' AND dcid='1138';
SELECT * FROM customerDCProducts 
WHERE customerid='B-26354';
如您所见,
dcid
productid
的集群键允许我对分区键(
customerid
)执行高性能查询,这些查询的焦点可以根据需要而定

缺点是什么?如果我想查询单个DC的所有产品,而不考虑客户,我不能。我需要构建一个不同的查询表来支持这一点。即使我只想查询一个产品,我也不能,除非我还提供了
customerid
dcid

如果我希望我的数据以某种方式排序,该怎么办?对于这个例子,我将从Patrick McFadin的文章中得到一个提示,并建立一个表来跟踪气象站的最新温度

CREATE TABLE latestTemperatures (
  weatherstationid text,
  eventtime timestamp,
  temperature text,
  PRIMARY KEY (weatherstationid,eventtime),
) WITH CLUSTERING ORDER BY (eventtime DESC);
通过对
eventtime
进行聚类,并指定
DESC
结束顺序,我可以查询特定电台的记录温度,如下所示:

CREATE TABLE blah (
  key text,
  a text,
  b timestamp,
  c double,
  PRIMARY KEY ((key), a, b, c)
)
CREATE TABLE customerDCProducts (
  customerid text,
  dcid text,
  productid text,
  productname text,
  productPrice int,
  PRIMARY KEY (customerid, dcid, productid));
SELECT * FROM latestTemperatures 
WHERE weatherstationid='1234ABCD';
返回这些值时,它们将按
eventtime
的结束顺序排列

当然,每个人(有RDBMS背景的人……是的,每个人)都想知道的一个问题是,如何查询所有按
eventtime
排序的结果?再说一次,你不能。当然,可以通过省略WHERE子句来查询所有行,但这不会返回按任何有意义的顺序排序的数据。重要的是要记住,Cassandra只能在分区键内强制执行集群顺序。如果您不指定一个,您的数据将不会被排序(至少不会按照您希望的方式排序)

如果您还有其他问题,请告诉我,我很乐意解释