非规范化现实
在我的数据库中,我有以下非常适合我的用例的非规范化表,并且我接收数据非常快......
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
)
);
但是,该表中有数十亿行,这对我们的硬件来说是个问题。因此,链接表设计中的每个备用字节对我们都有很大的好处。
标准化解决方案?
应用程序中链接表的平均选择包含十分之一/数百行。在最坏的情况下,选择包含数千行。因此,使用此表规范化问题可能是(恕我直言)明智的...
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
)
);
问题
如果我使用标准化链接和页表,我需要将它们加入应用程序。这不是问题,但是如何有效地从页表中选择相应的行呢?我觉得遍历链接表中的每一行结果并一一选择相应的页面行是无效的。