0

規格化現實卡桑德拉非規範化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 
    ) 
); 

問題

如果我用標準化的鏈接和頁面表,我需要加入他們的應用程序。這不會是一個問題,但如何有效地從頁面表中選擇相應的行?我感覺到,從鏈接表中遍歷每個結果行並逐一選擇相應的頁面行是無效的。

+1

我不太確定我是否理解你的問題。但是,如果您關心的是跨分區的邏輯行重複數據,那麼[靜態列](http://docs.datastax.com/en/cql/3.1/cql/cql_reference/refStaticCol.html)可以幫助您而不必更改整個表格佈局? – Ralf

+0

@Ralf:就是這樣!順便說一下,這是關於靜態列的解釋性文章:https://blogs.infosupport.com/static-columns-in-cassandra-and-their-benefits/。非常感謝你。 – Michal

回答

1

確實如此,JOIN效率不高,尤其是其中一個表非常大。一個可能的解決方案是構建一個額外的物化視圖,或某種索引以快速搜索特定列。這會使存儲量增加一倍,但無法實現這兩者:減少空間消耗並提高JOIN查詢性能。

也許你需要爲新的視圖或索引額外的硬件驅動程序。

必須注意的一件事是,當我們構建額外的視圖或索引時,需要額外的時間(資源)來更新某些列。例如,我們有兩個表格:訂單和用戶,我們通過JOIN搜索用戶「jack」的所有訂單。這是一個標準化的版本。在物化視圖,用戶「傑克」,他的所有列合併到他的命令,以便快速訪問:

primary_key, order_id, order_product, order_payment, user_name, user_age, user_favorite_color 

1,  1,  iphone,  1000,  jack,  25,  blue, 
2,  3,  book,   30,   jack,  25,  blue, 
3,  6,  car,   10000,  jack,  25,  blue, 

其中user_age,user_favorite_color從用戶表中提取的冗餘信息。當傑克改變他最喜歡的顏色時,所有這些記錄都必須改變其對應的列。通常情況下,數據庫系統將啓動後端步驟來執行此更新作業,但仍然是一個耗時的過程,成像插口有數千個訂單。