如何解决GCP 中 BigTable 中的列族如何与关系数据库中的列相关联
我正在尝试将当前位于关系数据库中的表迁移到 BigTable。 让我们假设该表当前具有以下结构:
表格:消息
列:
- Message_id
- Message_text
- Message_timestamp
如何在 BigTable 中创建类似的表? 从我在文档中看到的,BigTable 使用 ColumnFamily。 ColumnFamily 是否相当于关系数据库中的列?
解决方法
BigTable 在很多方面都不同于关系数据库系统。
关于数据库结构,BigTable 应该被认为是一个宽列的 NoSQL 数据库。
基本上,每个记录都由一个行表示,对于这一行,您可以提供任意数量的名称-值对。
该行具有以下特征。
行键
- 每一行都由一个行键唯一标识。它类似于关系数据库中的主键。该字段由系统按字典顺序存储,并且是表中唯一会被索引的信息。
- 在构建此键时,您可以选择单个字段或组合多个字段,用
#
或任何其他分隔符分隔。 - 此键的构建是构建表时要考虑的最重要的方面。您必须考虑如何查询信息。除其他外,请记住几件事(始终记住字典顺序):
- 通过连接字段来定义前缀,让您可以高效地获取信息。 BigTable 允许您扫描以特定前缀开头的信息。
- 相关,以一种允许您将公共信息(例如,在来自某个来源的所有消息中)存储在一起的方式对您的密钥进行建模,以便可以在一种更有效的方式。
- 同时,以最大限度地提高 BigTable 集群中不同节点之间的分散性和负载平衡的方式定义键。
列族
- 与行相关的信息组织在列族中。它与关系数据库中的任何概念都没有对应关系。
- 一个列族允许您将几个相关的字段、列聚集在一起。
- 您需要事先定义列族。
列
- 一列将存储实际值。它在某种意义上类似于关系数据库中的列。
- 您可以为不同的行设置不同的列。 BigTable 会稀疏地存储信息,如果您不为行提供值,它将不占用空间。
- BigTable 是一个三维数据库:对于每条记录,除了实际值之外,还会存储一个时间戳。
在您的用例中,您可以像这样为您的表格建模(例如,考虑到您也能够识别消息的来源,并且它是一个值信息):
行键 = message_origin#message_timestamp(截断为半小时、小时...)1#message_id
列族 = message_details
列 = message_text,message_timestamp
这将生成行键,例如,考虑消息是从 ID 为 MT43
的设备发送的:
MT43#1330516800#1242635
请按照@norbjd 的建议,查看相关的 documentation 以深入了解这些概念。
需要注意与关系数据库的一个重要区别:BigTable 仅提供原子单行事务,并且如果使用单集群路由。
1 参见,例如:How to round unix timestamp up and down to nearest half hour?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。