【问题标题】:Is Cassandra meant to be used as one big table?Cassandra 是否打算用作一张大桌子?
【发布时间】:2015-11-09 14:41:22
【问题描述】:

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

  1. 分布在多个节点上
  2. 性能呈线性增长
  3. 增加冗余

但是,在我们的办公室,我们正在考虑从 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 应该这样使用吗?

【问题讨论】:

    标签: database postgresql cassandra


    【解决方案1】:

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

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

    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)
    );
    

    现在您将能够搜索字段 employeeIdownerIdcarId...但前提是您还提供了分区键 id。主键定义中的顺序也很重要。要按某一聚类列进行搜索,您必须提供所有前面的列。即如果您想通过 carId 搜索,您还必须提供 employeeId 和 ownerId(以及 id)。

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

    Persons_by_id
    Persons_by_car
    Persons_by_job
    Cars_by_job
    

    【讨论】:

    • 我越想你的多桌建议,它就越开始听起来像 views 对我来说
    • 这可能非常相似,因为您通常会在 RDBMS 中构建一个您希望一起显示的数据的视图,而这通常也是您希望应用程序显示/使用的内容。 Cassandra 的目标是建立一个数据模型,这样您只需查看一张表并扫描一次数据即可获得所需的一切,然后返回给客户端。
    【解决方案2】:

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

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题。不幸的是,这不是很清楚。你能编辑一下吗?
    猜你喜欢
    • 2017-02-07
    • 2018-04-09
    • 2011-11-17
    • 1970-01-01
    • 2012-01-22
    • 2011-09-25
    • 1970-01-01
    • 2011-07-16
    • 2012-05-23
    相关资源
    最近更新 更多