规格化现实卡桑德拉非规范化VS正常化
在我的数据库我有以下这完全符合我的使用情况非规范化的表,我收到的数据非常快...
CREATE TABLE IF NOT EXISTS lp_webmap.link (
drank int,
prank int,
title text,
nofollow boolean,
created timestamp,
updated timestamp,
dst_ssl boolean,
dst_www boolean,
src_ssl boolean,
src_www boolean,
dst_domain_name1st text,
dst_domain_name2nd text,
dst_domain_name3rd text,
src_domain_name1st text,
src_domain_name2nd text,
src_domain_name3rd text,
dst_page text,
src_page text,
dst_page_title text,
src_page_title text,
src_domain_ownerreg text,
PRIMARY KEY (
(
dst_domain_name1st,
dst_domain_name2nd,
dst_domain_name3rd
),
created,
dst_page,
src_page,
src_domain_name1st,
src_domain_name2nd,
src_domain_name3rd
)
);
然而,该表中有数十亿行,这对我们的硬件是一个问题。因此,链接表设计中的每个备用字节对我们都有很大的好处。
Normalized solution?
从应用程序链接表中的平均选择包含十分之几/几百行。在最糟糕的情况下,选择包含数千行。因此,它可能是(恕我直言)明智使用该表正常化的问题...
CREATE TABLE IF NOT EXISTS lp_webmap.page (
domain_name1st text,
domain_name2nd text,
domain_name3rd text,
location text,
title text,
rank int,
www boolean,
update_interval smallint,
updated timestamp,
PRIMARY KEY (
(domain_name1st, domain_name2nd, domain_name3rd, location),
updated, rank, update_interval
)
);
问题
如果我用标准化的链接和页面表,我需要加入他们的应用程序。这不会是一个问题,但如何有效地从页面表中选择相应的行?我感觉到,从链接表中遍历每个结果行并逐一选择相应的页面行是无效的。
我不太确定我是否理解你的问题。但是,如果您关心的是跨分区的逻辑行重复数据,那么[静态列](http://docs.datastax.com/en/cql/3.1/cql/cql_reference/refStaticCol.html)可以帮助您而不必更改整个表格布局? – Ralf
@Ralf:就是这样!顺便说一下,这是关于静态列的解释性文章:https://blogs.infosupport.com/static-columns-in-cassandra-and-their-benefits/。非常感谢你。 – Michal