Database design Cassandra非规范化与规范化

Database design Cassandra非规范化与规范化,database-design,cassandra,database-normalization,cassandra-2.2,nosql,Database Design,Cassandra,Database Normalization,Cassandra 2.2,Nosql,非规范化现实 在我的数据库中,我有下面的非规范化表,它非常适合我的用例,我接收数据非常快 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,

非规范化现实

在我的数据库中,我有下面的非规范化表,它非常适合我的用例,我接收数据非常快

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
   )
);
问题


如果我使用规范化的链接表和页面表,我需要在应用程序中加入它们。这不会是一个问题,但是如何有效地从页面表中选择相应的行呢?我感觉遍历链接表中的每个结果行并逐个选择相应的页面行是无效的

的确,JOIN效率不高,尤其是其中一个表非常大。一个可能的解决方案是构建一个额外的物化视图,或某种索引,用于快速搜索特定列。这将使存储增加一倍,但无法同时实现这两个目标:减少空间消耗和提高连接查询性能

对于新的视图或索引,您可能需要一个额外的硬驱动程序

必须注意的一点是,当我们构建一个额外的视图或索引时,更新某些列会花费额外的时间(资源)。例如,我们有两个表:orders和users,我们通过JOIN搜索用户“jack”的所有订单。这是一个规范化版本。在物化视图中,用户“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是从用户表中提取的冗余信息。当jack更改他最喜欢的颜色时,所有这些记录都必须更改相应的列。通常情况下,DB系统会启动后端踏板来完成此更新工作,但这仍然是一个耗时的过程,图像处理杰克有数千份订单。

我不太确定我是否理解您的问题。但是,如果您关心的是在分区的逻辑行中重复数据,那么也许可以在不必更改整个表布局的情况下为您提供帮助?@Ralf:就是这样!顺便说一下,这是一篇关于静态列的解释性文章:。非常感谢你。