一般来说设计数据库需要考虑一对一或一对多的问题,我们看一下下面的数据:
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。这样每个类别下就可以存多个电话了。
分享到:
相关推荐
与传统的关系型数据库不同,Cassandra采用了列族(Column Family)数据模型,更适合处理大量结构化和半结构化数据,尤其适合实时分析和大数据场景。它的设计灵感来源于Google的Bigtable,但在架构上进行了优化,更...
其数据模型基于列族(Column Family),与传统的行存储数据库不同,它允许更灵活的数据结构和高效的查询。 1. 分布式架构:Cassandra通过分区(Partitioning)和复制(Replication)策略确保数据的分布和冗余。每个...
每个表(在Cassandra中称为ColumnFamily)由多个行组成,每行又包含多个列。 7. **Secondary Indexes**:虽然Cassandra最初设计为基于主键的快速查询,但后来引入了二级索引来支持其他查询模式。不过,二级索引使用...
4. **Column Family 和 SSTable**:Cassandra 存储数据时采用 Column Family(列族)的概念,类似于关系数据库中的表。SSTable (Sorted String Table) 是Cassandra的数据文件格式,3.11.13版本可能会包含对SSTable...
SuperColumn则是一种特殊的ColumnFamily,可以包含多个ColumnFamily。1.2.5可能对这两者的管理进行了优化,提升了查询性能。 4. **Consistency级别**:Cassandra提供了多种一致性级别供用户选择,平衡读写性能和...
1. **分布式架构**:Cassandra 是基于 Google 的 Bigtable 论文设计的,采用了分布式、无中心的架构,能够自动在多台服务器上复制数据,提供高可用性和容错性。 2. **数据模型**:Cassandra 支持列族(Column ...
4. **数据模型**:Cassandra 使用列族(Column Family)数据模型,类似于BigTable 和 HBase。它支持宽行和窄行两种模式,适合时间序列数据、日志数据等多种类型的数据存储。 5. **TTL(Time To Live)**:在3.7版本...
它是一个网络社交云计算方面理想的数据库,以 Amazon 专有的完全分布式的 Dynamo 为基础,结合了 Google BigTable 基于列族(Column Family)的数据模型。 Cassandra 的主要特点 ------------------- * 模式灵活:...
Cassandra 的ColumnFamily数据模型允许用户以列族的形式组织数据,支持宽行和时间序列数据的高效存储。CQL(Cassandra查询语言)的引入,使得对数据的操作更接近SQL,提高了开发者友好性。 Dynamo 和 Cassandra 都...
- 数据模型:Cassandra采用列族(Column Family)结构,类似于BigTable的设计,支持稀疏存储,适合大规模数据存储。 - 分区(Partitioning):数据按照分区键进行分布,保证数据的水平扩展性。 - 副本...
3. **列族模型**:不同于传统的行存储,Cassandra采用列族(Column Family)模型,允许灵活的数据结构,适合半结构化数据的存储。 4. **时间戳**:每个数据项都有一个时间戳,用于解决并发写入冲突。 在C#中操作...
Cassandra的数据模型是基于keyspace的,一个keyspace可以包含多个table,每个table又可以包含多个row,每个row又可以包含多个column family,每个column family又可以包含多个column。这种设计使得Cassandra具有高可...
在Cassandra中,数据模型包括键空间(Keyspace)、表(Table)和列族(Column Family),类似于传统关系型数据库的数据库、表和列的概念。 **键空间(Keyspace)** 键空间是Cassandra中最高级别的命名空间,可以...
在操作columnfamily和supercolumnfamily时,会用到batch_mutate等操作。 Cassandra使用手册详细介绍了数据库的安装、配置、数据模型、命令行操作、Java编程接口Thrift的使用,测试以及具体的系统实例实现。手册的...
4. **ColumnFamily与SuperColumnFamily**:Cassandra的数据模型基于列族(ColumnFamily)或超级列族(SuperColumnFamily),类似于表格但更灵活。列族支持动态列,允许在一行中添加任意多的列,而超级列族是列族的...
在 Cassandra 中,一个 ColumnFamily 相当于传统数据库中的表,但它不遵循严格的行与列的关系,而是以键值对的形式存储数据,允许更加灵活的数据结构。 ColumnFamily 中的每个实体(Key)可以有零个或多个 ...
- **Keyspace**:每个Keyspace可以看作是独立的数据逻辑空间,可以包含多个ColumnFamily,通常对应一个应用程序,如Twitter。 - **ColumnFamily**:类似于传统数据库的表,包含多个Column或SuperColumn。 - **Column...
- 数据模型:基于列族(Column Family),类似于键值对和宽表,支持动态字段和结构。 - 数据分区:使用一致性哈希(Consistent Hashing)进行数据分片,确保数据均匀分布。 - 写优化:Cassandra设计时更侧重于写...