SuperColumn TMD到底是什么?Cassandra数据模型介绍
(一)
Translated by leo zheng
原文地址:WTF is a SuperColumn? An Intro to the Cassandra Data Model
By Arin Sarkissian Digg
过去一两个月,Digg的工程师团队花费了大量时间研究、尝试Cassandra,并最终部署在生产环境。这是一个使用起来非常有趣的项目 ——
但是在享受乐趣之前,我们不得不花些时间搞清楚Cassandra的数据模型… “SuperColum TMD到底是什么”这句话被说了太多遍
如果你有关系型数据库的背景(几乎每个人都有),当学习Cassandra的数据模型时,你很可能会被一些命名规范困扰。我以及我在Digg的同事花了好
几天的时间讨论才真正弄明白。最近几周,有一封bikeshed(译注:指容易引起争论的、很难达成共识的话题)的邮件出现在开发者邮件列表里,建议使用
全新的命名方案以减少混乱。在整个讨论过程中,我一直在想:“可能用一些适当的例子可以减少人们对这些命名的困惑。”
因此,这就是我写此文来解释Cassandra数据模型的原因;它旨在帮助你从实例中学习,并不会深入每一个细节,但是,我还是希望它有助于你弄清一些东
西。
BTW:这篇文章比较长,如果你想要PDF版本,可以在这儿
下载。
各组成部分
在弄明白各个组成部分是如何组织在一起之前,让我们先一一认识它们:
Column
Column是数据增量最底层(也就是最小)的部分。它是一个包含名称(name)、值(value)和时间戳(timestamp)的三重元组。
下面是一个用JSON格式表示的column:
{ // 这是一个Column
name: "emailAddress",
value: "arin@example.com",
timestamp: 123456789
}
就是这样。简洁起见,让我们忽略时间戳,只把它看作一个name/value的对。
另外,需要注意的是,name和value都是二进制的(技术上指byte[]),并且可以是任意长度。
SuperColumn
SuperColumn是指这样一个元组:包含一个二进制的name,value为可以包含无限数量的Column的map —— 使用Column的name作为key。仍然以JSON格式为例:
{ // 这是一个SuperColumn
name: "homeAddress",
// 无限数量的Column
value: {
// 注意,key就是Column的name
street: {name: "street", value: "1234 x street", timestamp: 123456789},
city: {name: "city", value: "san francisco", timestamp: 123456789},
zip: {name: "zip", value: "94107", timestamp: 123456789},
}
}
Column vs SuperColumn
Column和SuperColumn都是拥有name、value的元组。最大的不同在于标准Column的value是一个“字符串”,而
SuperColumn的value是一个包含多个Column的map。这是主要的区别。。。它们的value包含的是不同类型的数据。另一个细微的差
别是:SuperColumn没有时间戳。
继续前进之前
在继续前进之前,我希望通过一些方式来简化我们的示例:1)从Column中去除时间戳 2)将Column和SuperColumn的名称移到外面,这样看上去像一个key/value对。于是我们从:
{ // 这是一个SuperColumn
name: "homeAddress",
// 无限数量的Column
value: {
street: {name: "street", value: "1234 x street", timestamp: 123456789},
city: {name: "city", value: "san francisco", timestamp: 123456789},
zip: {name: "zip", value: "94107", timestamp: 123456789},
}
得到
homeAddress: {
street: "1234 x street",
city: "san francisco",
zip: "94107",
}
分组
有一个简单的结构用来分组Column和SuperColumn。。。这个结构被称作ColumnFamily,并且拥有两种形式:标准的&超级的
ColumnFamily
ColumnFamily是一种可以包含无限数量的行(row)的结构。哈哈,你是说行吗?是的 —— 就是行 :) 为了让你更好的理解,把它(译注:ColumnFamily)想象成关系型数据库中的表。
好的 —— 每一行拥有一个由客户端提供的(也就是你)key,以及一个包含多个Column的map。再强调一次,map中的key是Column的name,value是Column本身:
UserProfile = { // 这是一个ColumnFamily
phatduckk: { // 这是ColumnFamily中这一行的key
// 这一行中无限数量的Column
username: "phatduckk",
email: "phatduckk@example.com",
phone: "(900) 976-6666"
}, // 这一行结束
ieure: { // 这是ColumnFamily中另一行的key
// 另一行中无限数量的Column
username: "ieure",
email: "ieure@example.com",
phone: "(888) 555-1212"
age: "66",
gender: "undecided"
},
}
记住:简单起见,我们只显示了Column的value,但事实上map中的value应该是整个Column。
你可以把它想象成HashMap/字典或关联数组( HashMap/dictionary or associative array)。如果你开始这么想了,那么你就走上正轨了。
需要指出的是:ColumnFamily没有固定模式(schema)。并没有预先定义行包含了哪些Column。在我们上面的示例中,你看到key是
“ieure”的行包含name为“age”和“gender”的Column,然而key是“phatduckk”的行并没有这两个Column。这是
100%灵活的:一个行可能包含1989个Column,而另一行只包含2个Column。一个行可能包含一个称作“foo”的Column,而其它的行
并没有。这就是Cassandra无模式的表现( This is the schemaless aspect of Cassandra)。
ColumnFamily也可以是超级的
现在,ColumnFamily可以有两种类型:标准的 或 超级的
我们刚才看到的示例是标准类型的ColumnFamily。标准类型的ColumnFamily是指所有的行包含的都是标准Column(即不是SuperColumn)的map。。。其中没有SuperColumn。
相反的,一个超级类型的ColumnFamily是指:每一行包含的是SuperColumn的map。这个map用SuperColumn的name作
为key,value是SuperColumn本身。并且,清楚起见,超级类型的ColumnFamily中不包含标准类型的ColumnFamily。
这儿是一个示例:
AddressBook = { // 这是一个超级类型的ColumnFamily
phatduckk: { // 这是Super ColumnFamily中这一行的key
// 这儿的key是地址簿所属人的名字
// 这一行中可以包含无限数量的SuperColumn
// 该行内(译注:每一行包含的是一个map)的key是SuperColumn的名称
// 每一个SuperColumn是一个地址簿的条目
friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"},
// 这是phatduckk的地址簿中被称作John的条目
John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
...
// 我们可以拥有无限数量的SuperColumn (即地址簿条目)
}, // 这一行结束
ieure: { // 这是Super ColumnFamily中另一行的key
// ieure的地址簿的所有条目
joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
},
}
Keyspace
Keyspace是数据分组的最外层。所有的ColumnFamily都包含在Keyspace当中。Keyspace常常用项目工程名称来命名。
Keyspace可以包含多个ColumnFamily,但这并不意味着它们之间有必然的关系(imposed
relationship)。例如:这并不像MySQL中的table。。。你不能对它们做关联(join)。这是因为假设ColumnFamily_1
有一个key为“phatduckk”的行,并不意味着ColumnFamily_2也有key为“phatduckk”的行。
分享到:
相关推荐
amily 是 Cassandra 数据模型的核心组成部分,用来组织和管理 Column 和 SuperColumn。在 Cassandra 中,一个 ColumnFamily 相当于传统数据库中的表,但它不遵循严格的行与列的关系,而是以键值对的形式存储数据,...
在Cassandra的数据模型中,SuperColumn家族是较旧的数据结构,它类似于传统关系数据库的表。一个SuperColumn家族由多个SuperColumns组成,每个SuperColumn又包含多个子列(或称为Columns)。这种结构允许数据以多维...
Cassandra 的数据模型是基于列族(Column Family)的,这是一种类似于 Amazon Dynamo 和 Google BigTable 的混合模型。 1. **Column (列)**:是最小的数据单元,由 name、value 和 timestamp 组成。例如:`{"name":...
Cassandra使用手册详细介绍了数据库的安装、配置、数据模型、命令行操作、Java编程接口Thrift的使用,测试以及具体的系统实例实现。手册的目的是为了让用户能够系统地理解和掌握Cassandra的使用方法,从而在实际的...
Cassandra采用了一种基于列族(Column Families)的数据模型,其中包含了Column、SuperColumn、ColumnFamily、Keyspaces、Row等核心概念。每个Keyspace可视为一个独立的命名空间,包含多个ColumnFamily。Row则是在...
Cassandra的数据模型允许模式的灵活性,意味着在存储数据时不必预先定义字段。你可以根据需要动态添加或删除字段,这对于大型部署尤其有用,因为它降低了重构数据模型的成本。 ### 真正的可扩展性 Cassandra支持...
总的来说,Cassandra 作为一款 NoSQL 数据库,以其强大的分布式特性和灵活的数据模型,成为了处理大规模、分布式环境下的结构化数据的理想选择。它的设计目标是处理大量实时数据,支持高并发读写操作,并能够在大...
**Cassandra 入门指南** ...随着对Cassandra的理解加深,你可以探索更多高级特性,如分布式数据模型、分区策略、复制策略、索引和触发器等。Cassandra是一个强大且灵活的数据库解决方案,尤其适合处理海量分布式数据。
Apache Cassandra 是一个分布式数据库系统,特别设计用于处理大规模的数据分布于多台服务器上,具有高可用性和可扩展性。在1.2.5版本中,它提供了许多关键特性和改进,使得这个开源数据库更适合处理PB级别的数据。 ...
Cassandra CLI是Apache Cassandra数据库系统的一个命令行工具,它提供了与Cassandra集群交互的能力,包括连接到远程节点、创建或更新模式(schema)、设置和检索记录及列,以及查询节点和集群元数据。这个工具主要...
3. 多数据中心支持:Cassandra能够配置为跨多个数据中心运行,确保即使一个数据中心出现故障,数据仍能在另一个数据中心访问,增强了数据的可用性和安全性。 【数据模型】 Cassandra的数据模型可以理解为四维或五...
1. 数据模型:Cassandra采用键值对存储,支持ColumnFamily、SuperColumn和Column。其数据模型设计灵活,适合大规模数据存储。 2. 分布式架构:Cassandra基于一致性哈希,实现去中心化的数据分布,保证了系统的可扩展...
Cassandra的数据模型基于列族(ColumnFamily)和超级列(SuperColumn)。每个表(Keyspace)由多个列族组成,列族内包含行(Row),行由列(Column)组成。列族可以视为关系数据库中的表,行则是记录,列是记录中的...
4. **数据模型**:理解 Cassandra 的数据模型很重要,因为它基于列族(ColumnFamily)和超级列(SuperColumn)。在 Astyanax 中,你可以创建对应的实体类来映射这些概念。 5. **异步操作**:Astyanax 支持异步操作...
- **SuperColumn**:一种特殊的列,用于组织相关的列集合。 - **Sorting**:支持按列排序。 - **存储**:采用行式和列式混合存储的方式。 - **API**:提供了多种语言的客户端API。 ##### 2. MongoDB - **特性**:...
运行游戏只需执行SuperColumn.exe 文件即可,没有SuperColumn.sav与SuperColumn.dat文件也可,它会自动在当前目录分别创建一个,另外,在当前目录下还需要动画鼠标ButterFly.ani,若没有就调用系统缺省的箭头鼠标,...
- **介绍**: Redis是一个开源的内存数据结构存储,可以用作数据库、缓存和消息中间件。 - **数据结构**: 支持字符串、哈希表、列表、集合、有序集合等多种数据结构。 #### 四、应用案例 ##### 1. eBay架构经验 - **...