我正試圖將一個RDBMS模型轉移到Cassandra,並且很難創建模式。這裏是我的數據模型:MySQL數據模型到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。在這個密鑰空間,我可以有一個名爲的ColumnFamily「域」,它就像我的域名錶中的SQL:
"Domain" : { //ColumnFamily
"domain1.com" : { "HasBadWords" : 0 }, //SuperColumn
"domain2.com" : { "HasBadWords" : 0 } //SuperColumn
}
下表是在那裏我開始感到困惑。 ZoneFile和Backlinks本質上應該是通過查找每個域的這些值來存儲結果的歷史記錄。所以,一個域到多個ZoneFile記錄。爲了查詢目的,我希望能夠輕鬆獲得'最新的'ZoneFile記錄或給定的域。我需要爲Backlinks做同樣的事情。
我正在考慮這樣的事情,而且按鍵上做了一系列的查找域,然後讓這應該是最新的時間戳「最後」的記錄......
"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\"}",
}
}
我將如何查詢域名行的名單,其中最新的時間戳比一個給定日期的?
我喜歡你要去的地方...我編輯過問題假設一個時間戳作爲列名和json打包數據。 – Redth
現在,假設我將如何查詢最近zonefile時間戳列的域比給定時間戳更早的域列表? – Redth
謝謝,我已經有效地完成了你的建議,儘管我最終使用MongoDB在我的查詢中獲得了更多的靈活性,這是將當前值非規範化並將它們粘在域文檔中的主要概念,文件爲每個領域和歷史...乾杯! – Redth