Cassandra是否意味着用作一张大桌子?

时间:2015-08-17 03:16:44

标签: database postgresql cassandra

Cassandra上的大多数文章都关注硬件优势

  1. 跨多个节点分发
  2. 效果线性扩展
  3. 增加冗余
  4. 然而,在我们的办公室,我们正在考虑从PostgreSQL迁移到Cassandra,原因很简单,在Cassandra中,人们可以将所有东西都放在桌子上,就像狂野的西部一样。

    因此,我们办公室的一般方法目前是这样的

    CREATE TABLE IF NOT EXISTS Person (
       id       SERIAL PRIMARY KEY,
       fname VARCHAR(256)
    );
    
    CREATE TABLE IF NOT EXISTS Job (
       id       SERIAL PRIMARY KEY,
       employeeId  INT REFERENCES (Person)
    );
    
    CREATE TABLE IF NOT EXISTS Car (
       id       SERIAL PRIMARY KEY,
       ownerId INT REFERENCES (Person),
       year INT
    );
    
    CREATE TABLE IF NOT EXISTS Insurance (
       id       SERIAL PRIMARY KEY,
       carId   INT REFERENCES (Car)
    );
    

    但是我们正在考虑向Cassandra迈进以实现类似下面的内容

    CREATE TABLE IF NOT EXISTS Lazy (
       id       SERIAL PRIMARY KEY,
       fname VARCHAR(256),
       employeeId  INT REFERENCES (Person)
       ownerId INT REFERENCES (Person),
       year INT
       carId   INT REFERENCES (Car)
    );
    

    我体内的每一条编程光纤都告诉我这是错的,但是将我们的前端从面向对象的层次结构转换为Postgres的关系模型是噩梦,因为我们有大量的嵌套外键。

    这是应该如何使用Cassandra吗?

2 个答案:

答案 0 :(得分:2)

这完全取决于您的数据访问模式。

考虑您的示例(删除不支持的功能):

CREATE TABLE IF NOT EXISTS Lazy (
   id INT PRIMARY KEY,
   fname VARCHAR(256),
   employeeId INT,
   ownerId INT,
   year INT,
   carId INT,
);

只能才能按ID搜索。您提供了id,您可以获得任何字段fname,employeeId,ownerId,year,carId。您无法使用任何其他ID字段进行查询。

您可以通过将它们添加为群集列来搜索这些内容,如下所示:

CREATE TABLE IF NOT EXISTS Lazy (
   id INT,
   fname VARCHAR(256),
   employeeId INT,
   ownerId INT,
   year INT,
   carId INT,
   PRIMARY KEY((id), employeeId, ownerId, carId)
);

现在,您可以搜索字段 employeeId ownerId carId ...但仅当您还提供分区时key id 。主键定义中的排序也很重要。要按其中一个聚类列进行搜索,您必须提供所有前面的列。即如果你想通过carId搜索,你还必须提供employeeId和ownerId(以及id)。

我怀疑这是你真正想要的。我建议用Cassandra对数据建模进行一些研究,看看Cassandra的优化内容。您可能最终会想要几个表,例如:

Persons_by_id
Persons_by_car
Persons_by_job
Cars_by_job

答案 1 :(得分:0)

Cassandra数据模型将根据查询。意味着你想从cassandra输出什么。不要像关系模型那样思考。 cassandra数据库是no-sql所以你可以将一种类型的数据写入更多的表。因为cassandra没有联接,这就是为什么你必须根据你的查询将所有数据放在一个表中。