2015-12-22 35 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作为集群键,源页面作为列 –