【问题标题】:Problems with designing a Key/Value database schema设计键/值数据库模式的问题
【发布时间】:2014-06-02 05:56:58
【问题描述】:

我正在尝试使用 Cassanda 设计一个键/值 NOSql 数据库。
从一个小型社交网络的关系数据库开始,我想使用 NOSql 数据库模型制作一个“等效”模式。

关系数据库有 3 个表,如下所示:

     -------------
     | User      |
     -------------
     |id         |
     |name       |
     |bday       |
     |...        |
     -------------

     -------------
     | Statut    |
     -------------
     |Userid     |
     |Statutid   |
     |text       |
     |timestamp  |
     |...        |
     -------------

     -------------
     | Comment   |
     -------------
     |User1id    |
     |User2id    |
     |text       |
     |timestamp  |
     |......     |
     -------------

在创建键空间时,我对应该创建多少列族感到困惑:

  • 每个表都有一个列族。
  • 只有一个列族代表用户及其所有状态和 cmets(以集合的形式)。

什么是最好的解决方案,具有最少的数据冗余并避免连接。

【问题讨论】:

  • 更重要的是,您需要回答哪些问题?如果添加一些示例查询,将关系表映射到 CQL3 表会更容易。
  • 您在 mysql 中的架构定义和用例会有所帮助。

标签: mysql sql cassandra nosql


【解决方案1】:

如果您想减少冗余并避免连接,MongoDB 将是最好的建模数据库。

请记住使用集合 SET 数据类型。
Straight from the docs集合值不得大于 64KB。
因此,使用SET 可能会给您带来问题,具体取决于您在其中存储的内容。

在 Cassandra 中,您可以使用 3 个列族来创建它。

DROP KEYSPACE your_keyspace ;
CREATE KEYSPACE your_keyspace
  WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};

USE your_keyspace;


CREATE TABLE user(
  id TIMEUUID PRIMARY KEY,
  name TEXT,
  bday TEXT,
  ...
);


CREATE TABLE user_statut(
  id TIMEUUID,
  userid TIMEUUID,
  body TEXT,
  created_at TIMESTAMP,
  ...
  PRIMARY KEY(userid, id)
);


CREATE TABLE user_comment(
  id TIMEUUID,
  user1id TIMEUUID,
  user2id TIMEUUID,
  body TEXT,
  created_at TIMESTAMP,
  ...
  PRIMARY KEY(user1id, user2id, id)
);

但这当然需要您进行 3 次不同的查询来连接所有数据。但这取决于您最终使用的任何查询。

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2011-03-21
    • 2021-03-30
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多