`

设计Cassandra Column Family---一对多

阅读更多

        一般来说设计数据库需要考虑一对一或一对多的问题,我们看一下下面的数据:

 

Contact: {
    ian: {
        name: "Ian Wu"
        phone: "3939889"
        birthday: "1983/01/01"
        email: "ianwu@example.com"
    }
    john: {
        name: "John Li"
        phone: "4499888"
        birthday: "1984/02/02"
        email: "johnli@example.com"
    }
}

       从上面的数据结构上我们可以看出,如果联系人有两个电话怎么办?在 cassandra 的数据模型里面column name是不可以重复的,所以上面的数据结构是无法存储两个电话号码的,总不能用phone1、phone2去解决吧。

       按照关系型数据库的设计原则,当需要一对多的时候,就建立一个多方表格来存储多方的数据,同时利用主键来连接两张表,而在cassandra里面我们也可以把增加一个 column family 来存多方数据,同时再用row key来维持两个 column family 的关系。

 

我们需要把Phone拉出来再建立一个 column family 来存储联系人多个电话。

<!--
Phone: {
    ian: {
        work: "3939889"
        home: "4499588"
        mobile: "0919919919"
    }
    john: {
        work: "4499888"
        work-fax: "4499999"
    }
}
-->
<ColumnFamily CompareWith="UTF8Type" Name="Phone"/>
 

细心的朋友会发现这个又有一个新的问题产生,解决了Phone的问题之后,那Email是不是也照搬呢,那万一联系人有许多的属性都要用到一对多解决的话,那不就是要建立很多个 column family。当然,除了上面的解法之外,我们也可以建立一个 super column family 叫做MoreInformation來把联系人所有的多方数据都存储在一起,像下面这样。

 

<!--
MoreInformation: {
    ian: {
        phone: {
            work: "3939889"
            home: "4499588"
            mobile: "0919919919"
        }
        email: {
            work: "ianwu@example.com"
            home: "ianwu@yahoo.com.tw"
        }
    }
    john: {
        phone: {
            work: "4499888"
            work-fax: "4499999"
        }
        email: {
            work: "johnli@example.com"
        }
    }
}
-->
<ColumnFamily ColumnType="Super"
              CompareWith="UTF8Type"
              CompareSubcolumnsWith="UTF8Type"
              Name="MoreInformation"/>
 

当然,所有的设计都不是完美的,上面的存储方式又有一个问题,如果ian有多个work的电话怎么办呢?像下面一这样来存储么?

MoreInformation: {
    ian: {
        phone: {
            work: {
                lexicalUUID1: "3939889"
                lexicalUUID2: ""
            }
        }
    }
}

这样做是肯定不行的因为super column已经是极限了

如果有这样的需求,我们可以修改之前的Phone column family 来满足多个work的电话。

 

<!--
Phone: {
    ian: {
        work: {
            UUID1: "3939889"
            UUID2: "3939889#1234"
        }
        home: {
            UUID3: "4499588"
        }
        mobile: {
            UUID4: "0919919919"
            UUID5: "0933123123"
        }
    }
    john: {
        work: {
            UUID6: "4499888"
        }
        work-fax: {
            UUID7: "4499999"
        }
    }
}
-->
<ColumnFamily ColumnType="Super"
              CompareWith="UTF8Type"
              CompareSubcolumnsWith="LexicalUUIDType"
              Name="Phone"/>
 

这里我们使用UUID来生成work、home里column name。这样每个类别下就可以存多个电话了。

 

 

 

2
2
分享到:
评论

相关推荐

    apache-cassandra-0.7.6-2

    与传统的关系型数据库不同,Cassandra采用了列族(Column Family)数据模型,更适合处理大量结构化和半结构化数据,尤其适合实时分析和大数据场景。它的设计灵感来源于Google的Bigtable,但在架构上进行了优化,更...

    apache-cassandra-1.1.12-bin.tar.gz

    其数据模型基于列族(Column Family),与传统的行存储数据库不同,它允许更灵活的数据结构和高效的查询。 1. 分布式架构:Cassandra通过分区(Partitioning)和复制(Replication)策略确保数据的分布和冗余。每个...

    Cassandra-The-Definitive-Guide.pdf.rar_cassandra

    每个表(在Cassandra中称为ColumnFamily)由多个行组成,每行又包含多个列。 7. **Secondary Indexes**:虽然Cassandra最初设计为基于主键的快速查询,但后来引入了二级索引来支持其他查询模式。不过,二级索引使用...

    apache-cassandra-3.11.13

    4. **Column Family 和 SSTable**:Cassandra 存储数据时采用 Column Family(列族)的概念,类似于关系数据库中的表。SSTable (Sorted String Table) 是Cassandra的数据文件格式,3.11.13版本可能会包含对SSTable...

    apache-cassandra-1.2.5

    SuperColumn则是一种特殊的ColumnFamily,可以包含多个ColumnFamily。1.2.5可能对这两者的管理进行了优化,提升了查询性能。 4. **Consistency级别**:Cassandra提供了多种一致性级别供用户选择,平衡读写性能和...

    apache-cassandra-3.11.14-bin.tar.gz

    1. **分布式架构**:Cassandra 是基于 Google 的 Bigtable 论文设计的,采用了分布式、无中心的架构,能够自动在多台服务器上复制数据,提供高可用性和容错性。 2. **数据模型**:Cassandra 支持列族(Column ...

    apache-cassandra-3.7

    4. **数据模型**:Cassandra 使用列族(Column Family)数据模型,类似于BigTable 和 HBase。它支持宽行和窄行两种模式,适合时间序列数据、日志数据等多种类型的数据存储。 5. **TTL(Time To Live)**:在3.7版本...

    Windows下的Cassandra 安装图文教程

    它是一个网络社交云计算方面理想的数据库,以 Amazon 专有的完全分布式的 Dynamo 为基础,结合了 Google BigTable 基于列族(Column Family)的数据模型。 Cassandra 的主要特点 ------------------- * 模式灵活:...

    Dynamo-and-Cassandra-paper

    Cassandra 的ColumnFamily数据模型允许用户以列族的形式组织数据,支持宽行和时间序列数据的高效存储。CQL(Cassandra查询语言)的引入,使得对数据的操作更接近SQL,提高了开发者友好性。 Dynamo 和 Cassandra 都...

    cassandra-sample-project-catalog-management-system:一个带有微型目录管理系统的cassandra示例项目

    - 数据模型:Cassandra采用列族(Column Family)结构,类似于BigTable的设计,支持稀疏存储,适合大规模数据存储。 - 分区(Partitioning):数据按照分区键进行分布,保证数据的水平扩展性。 - 副本...

    cassandra-C#应用

    3. **列族模型**:不同于传统的行存储,Cassandra采用列族(Column Family)模型,允许灵活的数据结构,适合半结构化数据的存储。 4. **时间戳**:每个数据项都有一个时间戳,用于解决并发写入冲突。 在C#中操作...

    Cassandra与HBase系统架构比对.pdf

    Cassandra的数据模型是基于keyspace的,一个keyspace可以包含多个table,每个table又可以包含多个row,每个row又可以包含多个column family,每个column family又可以包含多个column。这种设计使得Cassandra具有高可...

    cassandra-create-helper-script:在Jenkins作业中使用的Python包装器将处理创建角色,表和键空间

    在Cassandra中,数据模型包括键空间(Keyspace)、表(Table)和列族(Column Family),类似于传统关系型数据库的数据库、表和列的概念。 **键空间(Keyspace)** 键空间是Cassandra中最高级别的命名空间,可以...

    Cassandra使用手册

    在操作columnfamily和supercolumnfamily时,会用到batch_mutate等操作。 Cassandra使用手册详细介绍了数据库的安装、配置、数据模型、命令行操作、Java编程接口Thrift的使用,测试以及具体的系统实例实现。手册的...

    Practical Cassandra-带完整书签目录超清文字版.pdf

    4. **ColumnFamily与SuperColumnFamily**:Cassandra的数据模型基于列族(ColumnFamily)或超级列族(SuperColumnFamily),类似于表格但更灵活。列族支持动态列,允许在一行中添加任意多的列,而超级列族是列族的...

    Cassandra的数据模型介绍

    在 Cassandra 中,一个 ColumnFamily 相当于传统数据库中的表,但它不遵循严格的行与列的关系,而是以键值对的形式存储数据,允许更加灵活的数据结构。 ColumnFamily 中的每个实体(Key)可以有零个或多个 ...

    cassandra教程

    - **Keyspace**:每个Keyspace可以看作是独立的数据逻辑空间,可以包含多个ColumnFamily,通常对应一个应用程序,如Twitter。 - **ColumnFamily**:类似于传统数据库的表,包含多个Column或SuperColumn。 - **Column...

    Cassandra文档

    - 数据模型:基于列族(Column Family),类似于键值对和宽表,支持动态字段和结构。 - 数据分区:使用一致性哈希(Consistent Hashing)进行数据分片,确保数据均匀分布。 - 写优化:Cassandra设计时更侧重于写...

Global site tag (gtag.js) - Google Analytics