【问题标题】:MySQL Data Model to Cassandra Help?MySQL 数据模型到 Cassandra 帮助?
【发布时间】:2011-10-29 23:26:13
【问题描述】:

我正在尝试将 RDBMS 模型移至 Cassandra,但很难创建架构。这是我的数据模型:

CREATE TABLE Domain (
    ID INT NOT NULL PRIMARY KEY,
    DomainName NVARCHAR(74) NOT NULL,
    HasBadWords BIT,
    ...
);
INSERT INTO Domain (DomainName, HasBadWords) VALUES ('domain1.com', 0);
INSERT INTO Domain (DomainName, HasBadWords) VALUES ('domain2.com', 0);

CREATE TABLE ZoneFile (
    ID INT NOT NULL PRIMARY KEY,
    DomainID INT NOT NULL,
    Available BIT NOT NULL,
    Nameservers NVARCHAR(MAX),
    Timestamp DATETIME NOT NULL
);
INSERT INTO ZoneFile (DomainID, Available, Nameservers, Timestamp) VALUES (1, 0, "ns1", '2010-01-01');
INSERT INTO ZoneFile (DomainID, Available, Nameservers, Timestamp) VALUES (2, 0, "ns1", '2010-01-01');
INSERT INTO ZoneFile (DomainID, Available, Nameservers, Timestamp) VALUES (1, 1, "ns2", '2011-01-01');
INSERT INTO ZoneFile (DomainID, Available, Nameservers, Timestamp) VALUES (2, 1, "ns2", '2011-01-01');

CREATE TABLE Backlinks (
    ID INT NOT NULL PRIMARY KEY,
    DomainID INT NOT NULL,
    Backlinks INT NOT NULL,
    Indexed INT NOT NULL,
    Timestamp DATETIME NOT NULL
);
INSERT INTO Backlinks (DomainID, Backlinks, Indexed, Timestamp) VALUES (1, 100, 200, '2010-01-01');
INSERT INTO Backlinks (DomainID, Backlinks, Indexed, Timestamp) VALUES (2, 300, 600, '2010-01-01');
INSERT INTO Backlinks (DomainID, Backlinks, Indexed, Timestamp) VALUES (1, 500, 1000, '2010-01-01');
INSERT INTO Backlinks (DomainID, Backlinks, Indexed, Timestamp) VALUES (2, 600, 1200, '2010-01-01');

据此,我推断我可能有一个 Keyspace:DomainData。在这个键空间中,我可以有一个名为“Domain”的列族,就像我在 sql 中的域表:

"Domain" : { //ColumnFamily
    "domain1.com" : { "HasBadWords" : 0 }, //SuperColumn
    "domain2.com" : { "HasBadWords" : 0 }  //SuperColumn
}

接下来的表格是我开始感到困惑的地方。 ZoneFile 和 Backlinks 本质上应该存储查找每个域的这些值的结果历史记录。因此,一个域到多个 ZoneFile 记录。出于查询目的,我希望能够轻松获得“最新”的 ZoneFile 记录或给定的域。我需要对反向链接做同样的事情。

我正在考虑这样的事情,并对域的键进行范围查找,然后获取应该是最新时间戳的“最后”记录...

"ZoneFiles" : { //ColumnFamily
    "domain1.com:2010-01-01 12:00:00.000" : { "Available" : 0, "Nameservers" : "ns1" }, //SuperColumn
    "domain1.com:2011-01-01 12:00:00.000" : { "Available" : 1, "Nameservers" : "ns2" }, //SuperColumn
    "domain2.com:2010-01-01 12:00:00.000" : { "Available" : 0, "Nameservers" : "ns1" }, //SuperColumn
    "domain2.com:2011-01-01 12:00:00.000" : { "Available" : 1, "Nameservers" : "ns2" }  //SuperColumn
}

我不相信这是正确的答案,一个键中的字符串域和字符串日期时间的组合感觉是错误的。有人能指出我正确的方向吗?

编辑:

假设我使用:

"ZoneFiles" : {
  "domain1.com" : {
    timestamp1 : "{\"available\":1,\"nameservers\":\"ns1\"}",
    timestamp2 : "{\"available\":1,\"nameservers\":\"ns1\"}",
  }
}

如何查询最新时间戳早于给定日期的域行列表?

【问题讨论】:

    标签: data-modeling cassandra


    【解决方案1】:

    如果我正确理解了您的问题,您想在此模型上执行的唯一查询是“请给我获取给定域的最新区域文件或反向链接”?

    如果是这样,我会将这些的最新值存储在“域”列族中,在域行键下,在单独的列中。我还会存储这个最新值的更新时间(时间戳)。每次您获得区域文件和反向链接中信息的新值时,我都会覆盖“域”列族中的值并更新时间戳。

    我假设您还保留了这些历史数据,以便您可以查询它,并且我假设查询类型将是“向我显示两次之间给定域的所有更新”(这是正确的吗?)。如果是这样,我不会手动构造这样的复合行键,因为它需要您使用 Order Preserving Partitioner 从 get_range_slices 中获取正确的结果。您可能知道,使用 OPP 进行负载平衡可能是一项艰巨的任务。

    相反,我会将行键设置为域 id,列键设置为更新的时间戳。然后,您可以将更新打包成单个值(例如使用 json)、使用超级列或使用 0.8 中的新组合键。如果这样做,您可以使用 get_slice 来满足您的查询,并且它会在 Random Partitioner 中正常运行,从而使负载平衡更加容易。

    汤姆·威尔基 |阿库努 | www.acunu.com | @tom_wilkie

    回复评论:“我如何查询最近的 zonefile 时间戳列早于给定时间戳的域列表?”

    您可以通过插入另一个列族来做到这一点:

    row key: day (or hour, or some other reasonable 'bucketing') 
    column key: timestamp of update 
    value: domain
    

    ...每次更新区域文件时。然后,要获取自 t 以来最近更新的域,请执行以下操作:

    result = []
    for i in day(t) ... day(now):
        result.extend(get_slice(i, range(t, '')))
    

    这将要求您从结果中删除重复条目,因此只有在 t 非常新时才最有效。您还必须考虑写入的负载平衡,这会将所有负载集中在单个服务器上(因为在任何时候,您都只插入一行)

    如果这些权衡不合适,那么您可以查看 hadoop 集成并使用它来执行此查询。或者您可以进行其他权衡(使用 OPP,或者在写入之前先读取以删除重复项,这会很慢)

    【讨论】:

    • 我喜欢你的想法......我已经编辑了问题,假设时间戳作为列名和 json 打包数据。
    • 现在,假设我将如何查询最近 zonefile 时间戳列早于给定时间戳的域列表?
    • 谢谢,我已经按照您的建议有效地完成了,尽管我最终使用 MongoDB 在查询中获得了更多的灵活性,这是非规范化“当前”值并将它们插入的主要概念域文档,同时为每个域和历史保留另一个文档...干杯!
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2017-08-19
    • 2022-07-04
    • 2012-04-05
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多