数据管理:关系型数据库与区块链数据库对比
1. 引言
传统上,软件系统将数据存储在关系型数据库管理系统(RDBMS)中,偶尔也会使用文件系统等其他存储方式。近年来,用于存储文档、搜索结果等离散数据的No - SQL数据库越来越受欢迎。不过,RDBMS仍然是企业系统数据存储的首选。在这些解决方案中,维护数据库、确保数据完整性以及根据用户角色提供安全访问的责任由数据库所有者雇佣的管理员承担。这个集中的管理机构还负责诸如定期备份等管理活动。
另一方面,(公共)分布式账本技术(即区块链)作为去中心化的数据存储方式,正逐渐成为传统数据存储系统的替代方案。最初,这些技术是为支持加密货币而出现的。然而,它们的显著特点——分布式共识、不依赖集中式权威、内置信任机制以及低网络准入门槛,吸引了许多不同领域采用这项技术。为了能够自信地开发依赖分布式账本解决方案作为主数据库的企业应用程序,我们必须确保当前解决方案(主要是RDBMS)所支持的所有必要服务都能通过分布式账本解决方案充分提供。
本文对关系型数据库和区块链数据库在定义和部署数据结构、填充新条目以及检索相关数据以供进一步使用方面进行了初步研究。如今,最流行的分布式账本环境之一是基于区块链的以太坊平台,它支持构建去中心化应用程序,并允许通过脚本编写任意状态转换函数,这些脚本由以太坊虚拟机(EVM)执行。在以太坊中,状态由两种类型的账户组成:外部(私钥)账户和合约(合约代码)账户。外部账户可以通过创建交易向合约账户发送消息,合约账户在收到交易请求消息后,会使用给定的交易参数执行其合约代码,并且也可以向其他合约发送消息。合约账户包含其合约代码并存储持久变量的值,合约账户执行代码、存储数据值或调用其他合约账户的每一个操作都需要由合约交易的发起者付费。
由于以太坊是目前最常用的区块链开发平台,本文的研究也使用了它。作为以太坊的关系型数据库对应方案,我们选择了MySQL RDBMS,它提供了一套全面的高级RDBMS功能,也是最常用的RDBMS之一。
2. 实验
本实验在点对点能源交易场景下进行,具体场景如下:许多家庭(或农场及其他非能源小企业)通过太阳能光伏板、风力涡轮机等方式为自己生产可再生能源,并希望将多余的能源出售给其他家庭。多余的能源通过交易平台发布“出售请求”进行广告宣传,同样,有购买需求的用户会发布“购买请求”。交易平台上运行的点对点能源交易算法(ETA)会根据参与者的偏好为所有交易参与者计算分数,并根据这些分数匹配买卖请求。
实验步骤如下:
- 定义代表卖家和买家的数据结构:每个参与者将包含姓名、地址、经纬度等物理位置细节、联系方式以及交易偏好。
- 部署数据结构:通过关系型数据库或区块链启用其使用。
- 存储每个数据结构生成的数据:使用Random()函数随机生成用户数据值,以模拟大量用户的参与。
- 检索存储的数据以进行交易:通过点对点能源交易算法(ETA)形成卖家和买家之间的交易。
- 将交易记录存储回数据库。
2.1 使用MySQL RDBMS实现
在MySQL中,数据结构通过关系(即数据库中的表)来表示。具体步骤如下:
-
定义表和它们之间的关系
:
- 数据需要进行规范化处理,以消除数据冗余,确保实体之间的内聚性和一致性。
- 规范化后,数据被组织成一组相关的实体(即关系、表),并为每个记录条目定义唯一标识符(键),通过这些键在其他记录中建立数据之间的链接,确保实体之间的引用完整性。
-
部署关系
:使用CREATE TABLE命令,例如创建用户表的命令如下:
CREATE TABLE IF NOT EXISTS User (
UserId varchar(255) NOT NULL,
UserName varchar(255) NOT NULL,
UserAddress varchar(255) NOT NULL,
Postcode varchar(255) NOT NULL,
UserEmail varchar(255) NOT NULL,
UserPhone varchar(255) NOT NULL,
Longitude FLOAT NOT NULL,
Latitude FLOAT NOT NULL,
PRIMARY KEY (UserID)
);
- 数据存储 :使用INSERT命令将新记录插入到指定的表中,例如:
INSERT INTO EnergyType VALUES (1, 'PV', 'Solar Energy');
- 数据检索 :通过SELECT命令引用每个数据记录中的唯一键来检索特定记录,相关数据通过在其他表中重复使用相同的键来识别。
下面是MySQL操作流程的mermaid流程图:
graph TD;
A[定义表和关系] --> B[部署关系(CREATE TABLE)];
B --> C[数据存储(INSERT)];
C --> D[数据检索(SELECT)];
2.2 基于区块链的方法
在以太坊中,数据结构通过创建智能合约来定义,智能合约类似于RDBMS中的表。以太坊允许通过将数据结构拆分为多个合约并相互引用的方式来消除数据重复,这类似于RDBMS中的数据规范化。不过,合约之间的引用指向整个合约及其所有数据,而不是单个记录,这与RDBMS中按单个记录引用不同。合约还可以发出事件,为合约数据提供索引,以便在区块链外部快速过滤数据。
以下是一个代表卖家数据的智能合约示例:
contract ETPAccount {
bytes18 public postcode;
bytes32 public latitude;
bytes32 public longitude;
uint16 public pricePreference;
uint16 public distancePreference;
event ElectricityExported(uint period, uint exports);
event ElectricityImported(uint period, uint imports);
constructor(bytes18 _postcode, bytes32 _lat, bytes32 _lng, uint16 _ppref, uint16 _dpref) public {
postcode = _postcode;
latitude = _lat;
longitude = _lng;
pricePreference = _ppref;
distancePreference = _dpref;
}
function setPricePreference(uint16 _ppref) external {
pricePreference = _ppref;
}
function setDistancePreference(uint16 _dpref) external {
distancePreference = _dpref;
}
function storeExports(uint _period, uint _exports) external {
emit ElectricityExported(_period, _exports);
}
function storeImports(uint _period, uint _imports) external {
emit ElectricityExported(_period, _imports);
}
}
部署 :与区块链的交互分为两类:只读交互(调用)和可能改变状态的交互(交易)。部署智能合约需要通过交易将其记录到区块链网络的永久寄存器中,并验证其是否符合预期的格式和规则。本实验在以太坊的Ropsten测试网络上进行,使用MetaMask(Chrome浏览器扩展)创建外部账户。新账户初始资金为零,但Ropsten网络提供免费测试资金。合约部署到网络后,会得到一个合约地址用于在网络中标识该合约。
数据存储
:使用合约地址与已部署智能合约的公共方法进行交互。例如,在上述智能合约中,可以创建交易来调用
storeExports()
函数,将数据永久存储在区块链上。在本实验中,使用单页应用程序(SPA)插入买家/卖家数据,插入数据时会创建一个交易,该交易被放入一个块中,由矿工验证后插入区块链。在交易处理(挖矿)之前,合约用户需要支付矿工费用。
数据检索 :由于区块链中的每个块包含一组离散的交易,不能像RDBMS那样通过单个记录的外键直接引用跨多个合约的数据。数据通过存储数据的智能合约地址进行检索,具体检索方法取决于智能合约内部的存储类型。如果智能合约向网络发出事件,可以使用过滤器查询这些事件,但过滤器的功能有限,每个事件只有三个可索引参数。如果数据直接存储在智能合约的存储中,可以通过调用合约内部的变量来直接访问。
下面是区块链操作流程的mermaid流程图:
graph TD;
A[定义智能合约] --> B[部署合约(交易)];
B --> C[数据存储(创建交易)];
C --> D[数据检索(根据合约地址和存储类型)];
3. 技术局限性与讨论
在使用两种不同技术为点对点能源交易领域实现后端数据库后,我们发现了一些局限性和可替代方案,具体讨论如下:
3.1 使用MySQL的观察
-
优点
:
- 安装和使用简便 :MySQL易于安装和使用,降低了使用门槛。
- 安全应用层 :RDBMS的管理系统(MS)在数据库周围创建了一个安全的应用层,能有效处理基于角色的访问控制、数据插入和检索时的一致性和可靠性,以及同时进行的更改、读取、更新和写入操作请求。
- 高效查询语言 :基于ANSI - SQL的标准查询语言提供了一种高效且复杂的方式来从数据库中查询详细数据。此外,可以以“累加”的方式定义现有表之间的新关系,而不会使先前存在的关系失效。
-
局限性
:
| 局限性 | 具体描述 |
| — | — |
| 透明度不足 | 当RDBMS中的数据被更新或更改时,用户无法看到这些更改,这降低了用户对存储在数据库中数据的信心。 |
| 缺乏不可变性 | 数据插入RDBMS后可以随时更改,不具备不可变的特性。 |
| 开放性受限 | RDBMS通常由企业拥有,不具有开放性。 |
| 数据格式要求高 | 数据在存储到RDBMS之前需要进行工程处理(规范化并通过外键相互关联),这降低了灵活性,不同数据格式的不同数据源无法使用RDBMS存储数据。 |
3.2 使用区块链的观察
区块链为数据存储提供了一个开放、透明、不可变和分布式的平台,在一定程度上解决了RDBMS的上述缺点。然而,基于区块链的方法也存在一些局限性:
-
数据查询困难
:区块链没有复杂的数据查询机制来查询存储在其中的数据。用户从区块链获取数据的方式有以下几种,且其中两种需要知道智能合约地址:
-
使用“allEvents”量化器
:Web3框架提供的“allEvents”量化器可以返回自智能合约部署以来与该合约注册的所有事件。但这种方式无法控制获取的数据量和检索时间,用户必须先检索所有数据,然后再选择相关条目。
-
通过合约指定的数据返回函数
:智能合约可以指定数据返回函数,对于每次调用该函数返回特定类型的所有数据的情况可能有效(例如,返回注册到该平台的所有用户)。但这种方式的查询灵活性非常有限(例如,除非在合约部署前指定特定函数,否则无法仅返回当年注册的用户)。
-
事件过滤
:如果智能合约向网络发出事件,可以使用过滤器对任何索引参数进行查询,类似于SQL中的SELECT语句。但这些过滤器的功能有限,每个事件只有三个可索引参数,并且可以根据块号进行过滤,但这需要对存储的数据有一定的了解才能有效使用。
以下是两种数据库技术优缺点对比表格:
| 数据库类型 | 优点 | 缺点 |
| — | — | — |
| MySQL | 安装使用简便、有安全应用层、查询语言高效 | 透明度不足、缺乏不可变性、开放性受限、数据格式要求高 |
| 区块链 | 开放、透明、不可变、分布式 | 数据查询机制不复杂、查询灵活性有限 |
综上所述,在选择数据库时,开发者需要根据具体的应用场景和需求来权衡关系型数据库(如MySQL)和区块链数据库的优缺点。如果对数据的透明度、不可变性和开放性有较高要求,且能够接受相对复杂的数据查询方式,那么区块链数据库可能是一个不错的选择;如果更注重数据查询的灵活性、安装和使用的简便性以及对现有数据格式的兼容性,关系型数据库可能更适合。在实际应用中,也可以考虑将两者结合使用,以充分发挥它们的优势。
下面是选择数据库的决策流程图:
graph TD;
A[开始] --> B{对透明度、不可变性、开放性要求高?};
B -- 是 --> C{能接受复杂数据查询方式?};
C -- 是 --> D[选择区块链数据库];
C -- 否 --> E[需权衡或结合使用];
B -- 否 --> F{注重查询灵活性、安装简便性和数据格式兼容性?};
F -- 是 --> G[选择关系型数据库];
F -- 否 --> E;
关系型数据库与区块链对比
超级会员免费看
949

被折叠的 条评论
为什么被折叠?



