【问题标题】:Data modeling with Cassandra使用 Cassandra 进行数据建模
【发布时间】:2015-09-05 02:40:49
【问题描述】:

我无法获得 Cassandra 的数据建模方式,主要是因为这是我第一次使用非关系型数据库。我现在不确定如何制作我的模型。基本上我的模型包括星系、恒星、星云、行星和卫星。一个星系可以拥有所有这些,所以它是一个 N:M 关系。据我了解,这个想法是用所有这些组件制作一个表,或者至少我是这样理解 Cassandra 的数据建模策略和非规范化的想法。

但我觉得这不太对劲,而且我不知道该怎么做。

【问题讨论】:

  • 为您的数据库确定正确的数据模型不仅取决于您将在数据库中拥有什么,还取决于您将如何使用它——您的 INSERT 是什么并且 SELECT 看起来像,您将拥有多少个,它们之间的比率是多少,等等。有一个非常好的关于 C* 数据建模的在线课程,您可能会觉得很有趣:academy.datastax.com/courses/ds220-data-modeling

标签: cassandra data-modeling database nosql


【解决方案1】:

查看此问题的一种方法是根据您尝试建模的实体的关系。例如,星系有恒星,恒星有行星,行星有卫星;它们都有一定的特征(轨道周期以天为单位,半径以公里为单位)。你可以这样建模:

CREATE TABLE galaxyobjects (
  galaxy text,
  star text,
  planet text,
  moon text,
  spectralclass text,
  radiuskm double,
  orbitalperioddays double,
  PRIMARY KEY ((galaxy, star), planet, moon)
);

当然,谱类实际上只适用于star 列,但在非规范化模型中,您会在每一行上看到它。

插入一些数据后,我的表格可能是这样的:

aploetz@cqlsh:stackoverflow> SELECT * FROM galaxyobjects;

 galaxy    | star       | planet      | moon   | orbitalperioddays | radiuskm | spectralclass
-----------+------------+-------------+--------+-------------------+----------+---------------
 Milky Way | Kepler-186 | Kepler-186f |    n/a |          129.9459 |     7072 |            M1
 Milky Way |        Sun |       Earth |   Moon |              27.3 |   3474.8 |            G2
 Milky Way |        Sun |       Earth |    n/a |           365.256 |     6371 |            G2
 Milky Way |        Sun |     Jupiter | Europa |             3.551 |   1560.8 |            G2
 Milky Way |        Sun |     Jupiter |     Io |              1.77 |   1821.6 |            G2
 Milky Way |        Sun |     Jupiter |    n/a |           4332.59 |    71492 |            G2

(6 rows)

现在,如果我想查询木星及其卫星:

aploetz@cqlsh:stackoverflow> SELECT * FROM galaxyobjects 
    WHERE galaxy='Milky Way' AND star='Sun' and planet='Jupiter';

 galaxy    | star | planet  | moon   | orbitalperioddays | radiuskm | spectralclass
-----------+------+---------+--------+-------------------+----------+---------------
 Milky Way |  Sun | Jupiter | Europa |             3.551 |   1560.8 |            G2
 Milky Way |  Sun | Jupiter |     Io |              1.77 |   1821.6 |            G2
 Milky Way |  Sun | Jupiter |    n/a |           4332.59 |    71492 |            G2

(3 rows)

注意事项:

  • 我将galaxystar 指定为分区键。由于 Cassandra 每个分区最多有 20 亿列,并且一个星系肯定有数十亿个物体在其中运行,我认为额外的分区 star 是必要的。请注意,在此模型中,您必须在每个查询中同时指定 galaxystar
  • 我想您可以扩展分区键以包含 planet,但是您将无法查询 star 的行星。
  • 在此模型中,planetmoon 是聚类键,因此不需要在每个查询中指定它们。但是,您不能跳过它们,因此您将无法(在 WHERE 子句中)指定 moon 而不指定 planet
  • 在单独查询行星(没有月亮)时,我的数据建模感觉不太喜欢使用n/a 作为聚类键。所以也许有更好的方法来建模。也许一组卫星会更合适?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2016-03-17
    • 2015-12-25
    相关资源
    最近更新 更多