Cassandra NoSQL - 域和页面的最佳数据结构
Cassandra NoSQL - optimal data structure for domains and pages
我从 noSQL 开始,看过像这样的很棒的教程和解释 https://www.youtube.com/watch?v=tg6eIht-00M。但是,我仍然以关系的方式思考,这就是为什么我请求你的帮助。
我有以下简单的关系模型,它存储域及其页面,并且能够保留页面标题和描述更新的历史记录。
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:
我应该创建非规范化 table 页面并根据域后缀(.com、.net、.de、...)和名称将其分布在分区上。并设置聚类索引更新时间。
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,所以会有很多重复。
- 每次更新都会产生整行数据而不是它的一部分
- 我想要来自其他 table 的地址域或页面。例如,我有另一个 table domain_technlogy 将网络技术分配给域
最佳结构是什么样的?
使用 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)
);
将允许您查找 url+title+descr 知道后缀+域名,并且 return 如果您知道 page_updated
,则可以查找单个记录,或者 [=22] =] 所有记录的更新按 page_updated
排序。那是你需要做的吗?这就是你需要做的吗?你用 url
做什么?
我从 noSQL 开始,看过像这样的很棒的教程和解释 https://www.youtube.com/watch?v=tg6eIht-00M。但是,我仍然以关系的方式思考,这就是为什么我请求你的帮助。
我有以下简单的关系模型,它存储域及其页面,并且能够保留页面标题和描述更新的历史记录。
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:
我应该创建非规范化 table 页面并根据域后缀(.com、.net、.de、...)和名称将其分布在分区上。并设置聚类索引更新时间。
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,所以会有很多重复。
- 每次更新都会产生整行数据而不是它的一部分
- 我想要来自其他 table 的地址域或页面。例如,我有另一个 table domain_technlogy 将网络技术分配给域
最佳结构是什么样的?
使用 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)
);
将允许您查找 url+title+descr 知道后缀+域名,并且 return 如果您知道 page_updated
,则可以查找单个记录,或者 [=22] =] 所有记录的更新按 page_updated
排序。那是你需要做的吗?这就是你需要做的吗?你用 url
做什么?