非正規化された現実
私のデータベースには、ユースケースに完全に適合する非正規化テーブルがあり、非常に高速にデータを受信しています...
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
)
);
ただし、このテーブルには数十億の行があり、これはハードウェアの問題です。このように、リンク テーブルの設計で節約されたすべてのバイトは、大きなメリットをもたらします。
正規化されたソリューション?
アプリケーションのリンク テーブルからの平均的な選択には、数十分の行または数百の行が含まれます。最悪の場合、select には数千行が含まれます。したがって、この表を使用して問題を正規化することは(imho)賢明かもしれません...
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
)
);
質問
正規化されたリンク テーブルとページ テーブルを使用した場合、それらをアプリケーションで結合する必要があります。それは問題にはなりませんが、ページ テーブルから対応する行を効果的に選択するにはどうすればよいでしょうか。リンクテーブルから得られたすべての行を繰り返し処理し、対応するページ行を1つずつ選択することは効果的ではないと感じています。