2015-12-22 32 views
0

我從noSQL開始,觀看了如此精彩的教程和解釋,如https://www.youtube.com/watch?v=tg6eIht-00M。但是,我仍然以關係的方式思考,這就是爲什麼我要求你的幫助。Cassandra NoSQL - 針對域和頁面的最佳數據結構

我有以下簡單的關係模型,它存儲域及其頁面,並且能夠保留頁面標題和描述更新的歷史記錄。

CREATE TABLE domain (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    name TEXT, 
    suffix TEXT, 
    PRIMARY KEY (id) 
) ENGINE=InnoDB; 

CREATE TABLE page (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    domainid bigint(20), 
    url TEXT, 
    PRIMARY KEY (id), 
    FOREIGN KEY (domainid) REFERENCES domain(id) 
) ENGINE=InnoDB; 

CREATE TABLE page_update (
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    pageid bigint(20), 
    updated TIMESTAMP, 
    title TEXT, 
    descr TEXT, 
    PRIMARY KEY (id), 
    FOREIGN KEY (pageid) REFERENCES page(id) 
) ENGINE=InnoDB; 

我想這個模型轉移到CQL:

我應該創建非規範化的表頁面,並根據域名後綴在分區分發(.COM,.NET,由Matchi.com提供回到...)和名稱。並設置聚簇索引更新時間。

CREATE TABLE page (
    domain_name text, 
    domain_suffix text, 
    page_url text, 
    page_title text, 
    page_descr text, 
    page_updated timestamp,  
    PRIMARY KEY ((domain_suffix, domain_name), page_updated) 
); 

不過,我不知道這是否是最佳的,因爲

  • 我必須保持域名,後綴和頁面URL對於每個更新,所以會有很多duplicities。
  • 每次更新都會產生整行數據而不是其部分
  • 我想要地址域或來自其他表的頁面。舉例來說,我有一個指定的Web技術領域

怎麼能最優的結構看起來像另一個表domain_technlogy?

回答

2

對於cassandra,模型的正確方法是先考慮SELECT查詢,然後構建便於查詢的表。

您需要哪些查詢?

您所提供的模式:

CREATE TABLE page (
    domain_name text, 
    domain_suffix text, 
    page_url text, 
    page_title text, 
    page_descr text, 
    page_updated timestamp,  
    PRIMARY KEY ((domain_suffix, domain_name), page_updated) 
); 

將讓您查找起來網址+標題+ DESCR知道一個後綴+域名,並返回一個單一的記錄,如果你知道page_updated,或者都返回記錄的更新按page_updated排序。那是你需要做的嗎?這就是你需要做的一切嗎?你用什麼url

+0

感謝您的回覆。大多數情況下,我想檢索單個記錄(最新更新的頁面)。但對我來說最關鍵的是另一個名爲「鏈接」的表格,該表格存儲實際的源頁面和目標頁面,我想列出鏈接中給定目標頁面的所有記錄。 – Michal

+1

因此,您需要創建一個表格,其中包含目標頁面作爲分區鍵,鏈接ID作爲集羣鍵,源頁面作爲列 –