-
MongoDB是NoSQL类型的文档数据库,是一个基于分布式文件存储的开源文档型数据库系统,是一个介于关系数据库和非关系数据库之间的产品,专为可扩展性、高性能以及高可用性而设计的数据库,是非关系型数据库中功能最丰富且最像关系型数据库的,它支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型[6-8]。它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引,并提供了聚合、分片和负载均衡等功能,能够通过简单地横向扩展来提高读写性能和大规模数据批处理[9]。
-
MongoDB数据库的层次结构跟关系型数据库类似,其层次关系为:一套数据库管理软件可以包括多个数据库,而每个数据库下又可以包含多个集合,每个集合中又可以包含多个文档[10-11],如图3所示。集合对应关系型数据库的表,一个文档对应关系型数据库的一行数据,如表1所示。
MongoDB数据库具有如下几个主要优点:
1)高性能。存储引擎能够高效使用内存,减少IO次数,提供高性能的数据持久性,索引支持更快的查询[12]。
MongoDB数据库 关系型数据库 Database(数据库) Database(数据库) Collection(集合) Table(表) Document(文档) Row(行) Field(字段) Column(列) Table 1. Database term comparison
2)高可用性。提供了副本集架构,通过类似主从(备)模式,提供自动故障转移和数据冗余。
3)高扩展性。通过数据分片实现方便实现水平扩展,突破单机的存储能力,提升数据的读写效率。
4)强大的查询功能。不仅支持关系型数据库的单表查询功能,还支持强大的聚合计算[13]。
5)灵活的数据结构。不需要预先定义数据结构和数据类型,支持动态增加文档的字段[14]。
当然MongoDB数据库也有一些局限性,不适合事务一致性很高的场景,如银行核心交易数据,以及其他涉及财务等相关场景,也不适合涉及多表复杂联查的场景[15]。
-
MongoDB数据库不需要像关系型数据库那样必须先定义表结构才能进行数据的存储,并且MongoDB数据库同一个集合里面的每一文档都可以有不同的字段,所以MongoDB非常适合存储拥有不同属性的数据,如,不同的设备或元件只有部分属性相同,大部分属性是不同的,如图4、图5所示。图中以“etattr_”开头是独有属性,它们有不同属性且属性个数相差很大,图4所示元件的是一个窗(一种元件),它拥有的属性只有11个,图5所示元件的是一个钢管(一种元件),它拥有属性却有40个,但它们都属于元件这个集合。图中其他不是以”etattr_”开头属性,是管理这个元件集合的管理属性或固有属性。
虽然MongoDB数据库不需要预先定义集合的数据结构,但是直接使用、或者随意使用将会导致数据混乱,如:同一种类型设备或元件的相同属性用不同的数据类型表示,或者采用不同的属性名,将会导致数据标准不统一、后期无法很好地对设备或元件进行查询分析。
为了解决这个问题,系统设计的时候必须为这些设备或元件关联到一个自定义的数据模板,模板定义了相同类型的设备或元件的属性名、属性的数据类型,以保证数据标准统一,当然不同的设备或元件有不同的模板。这个模板其实就是元数据,定义数据的数据,如图6所示,是管接头(一种元件)的部分自定义属性。
系统设计的时候可以采用树结构模型对数据进行组织管理,树结构是多层次的组织结构,易于理解、容易管理、扩展。实体数据(是客观存在并可相互区别的事物,对现实世界中事物的抽象,可以是元件,可以是设备,也可以是其他东西,取决使用者对它定义)内置了一些固定属性用于维护基本信息,包括:内部唯一标识、外部唯一标识、数据模板标识、编码、父子关系、层级结构,这些属性的作用如表2所示。其中topicName是较为特殊的属性,记录了当前实体数据在树结构从根节点到该节点的位置信息,也就是这个实体在树结构中的层级信息,它由各个节点的_id组成,以“/”分隔,并对该属性建立索引。它的作用是在查询分析时,能够快速地只匹配实体树上的某个节点下的实体数据。如需要统计某个节点下的各种设备或元件的数量,就可以使用如下的SQL语句进行查询:
字段 字段含义 _id 自增主键,内部唯一标识 code 编码或者名称 entityUuid 外部唯一标识/KKS码,对接外部系统 entityType 树节点的类型,管理节点或实体节点 parentId 父节点的主键 classId 数据模板的id topicName 树上的层次结构 Table 2. Fixed property meaning
SELECT class_id,count(*) FROM entity WHERE topicName like '178/463/%' GROUP BY class_id
除了上面固定属性外,其他属性都属于数据模板中自定义的属性,这些属性存储在MongoDB中时以固定“etattr_”作为前缀,如图4或图5中以“etattr_”前缀的都属于自定义的属性,这个前缀是系统自动加上的,对于使用者是不可见的。系统可以通过开放接口的方式,给其他的应用通过数据模板来自定义具体的实体数据的不同属性,通过数据模板维护实体数据的属性,保证相同设备或元件具有相同的属性名、相同属性类型,避免数据不统一的问题。
相较于关系型数据库,自定义属性除了支持基本数据类型(字符串、整型、浮点型、布尔型、时间类型)之外,还支持基本数据类型数组(Array)、复合数据类型、复合数据类型数组。这些复杂属性的支持在设备树管理中非常有用的,如可以对设备进行分组管理,特别一个设备可以属于多个组的场景,如图7所示,分组属性etattr_tags是一个字符串数组,这个设备有多个组的标签,对“red”组或者“green”组的设备进行个数统计时,可以使用如下语句:
SELECT count(*) FROM entity WHERE etattr_tags = "red"
SELECT count(*) FROM entity WHERE etattr_tags = "green"
有些读者可能好奇为什么可以通过SQL语句对MongoDB数据库进行查询,因为开发人员或者数据分析人员对SQL语言比较熟悉,系统设计的时候可以提供通过SQL语句查询的功能,它能够将常用的单表查询的SQL语句解析转换为MongoDB数据库的查询语言,便于相关人员对实体数据的统计分析。
Application of MongoDB Database in Power Engineering Industry
doi: 10.16516/j.gedi.issn2095-8676.2023.S1.018
- Received Date: 2022-10-26
- Rev Recd Date: 2022-12-17
- Publish Date: 2023-06-30
-
Key words:
- electric power /
- engineering big data /
- data diversity /
- relational database /
- MongoDB /
- data modeling /
- flexible
Abstract:
Citation: | YU Jianzhong. Application of MongoDB Database in Power Engineering Industry[J]. SOUTHERN ENERGY CONSTRUCTION, 2023, 10(S1): 110-116. doi: 10.16516/j.gedi.issn2095-8676.2023.S1.018 |