【发布时间】: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\"}",
}
}
如何查询最新时间戳早于给定日期的域行列表?
【问题讨论】: