首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL数据模型对卡桑德拉的帮助?

MySQL数据模型对卡桑德拉的帮助?
EN

Stack Overflow用户
提问于 2011-08-18 16:45:56
回答 1查看 428关注 0票数 2

我试图将RDBMS模型移到Cassandra,并且很难创建模式。以下是我的数据模型:

代码语言:javascript
复制
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');

由此,我推断出我可能有一个键空间: DomainData。在这个键空间中,我可以有一个名为" Domain“的列族,它类似于sql中的域表:

代码语言:javascript
复制
"Domain" : { //ColumnFamily
    "domain1.com" : { "HasBadWords" : 0 }, //SuperColumn
    "domain2.com" : { "HasBadWords" : 0 }  //SuperColumn
}

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

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

代码语言:javascript
复制
"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
}

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

编辑:

假设我使用:

代码语言:javascript
复制
"ZoneFiles" : {
  "domain1.com" : {
    timestamp1 : "{\"available\":1,\"nameservers\":\"ns1\"}",
    timestamp2 : "{\"available\":1,\"nameservers\":\"ns1\"}",
  }
}

如何查询最新时间戳比给定日期更旧的域行列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-18 18:07:32

如果我正确地理解了你的问题,你想在这个模型上做的唯一的查询是“请给我一个给定域的最新区域文件或反向链接”?

如果是这样的话,我将将这些列的最新值存储在域行键下的"Domain“列族中,并将其存储在单独的列中。我还会在更新最新值(时间戳)时存储该值。每次您在zonefile和反向链接中获得信息的新值时,我只需重写"Domain“列系列中的值并更新时间戳。

我假设您还保存了这些历史数据,以便查询它,并且假设这种查询将是“显示给定域的所有更新两次”(这是正确的吗?)如果是这样的话,我不会手动构造这样的复合行键,因为它将要求您使用保持顺序的分区器从get_range_slices获得正确的结果。正如您可能知道的那样,使用OPP进行负载平衡可能是一项困难的任务。

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

汤姆·威尔基( @tom_wilkie )-阿克努( Acunu )- www.acunu.com

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

您可以通过插入另一个列家族来实现这一点:

代码语言:javascript
复制
row key: day (or hour, or some other reasonable 'bucketing') 
column key: timestamp of update 
value: domain

更新区域文件的...every时间。然后,要获得自t以来最新更新的域,请执行以下操作:

代码语言:javascript
复制
result = []
for i in day(t) ... day(now):
    result.extend(get_slice(i, range(t, '')))

这将要求您从结果中删除重复条目,因此只有在t是最近的时候才能最好地工作。您还必须考虑写操作的负载平衡,这将将所有负载集中在单个服务器上(因为,在任何时候,您只插入一行)。

如果这些权衡是不合适的,那么您可以查看hadoop集成并使用它来执行此查询。或者您也可以进行其他权衡(使用OPP,或者在写入之前进行读取以删除副本,这将是缓慢的)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7111052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档