这段时间由于工作需要,接触了多种数据库。其中关系型数据库包括:Oracle、DB2、Informix、Teradata、Netezza、MySQL、MS SQLServer、Sybase、PostgreSQL、Greenplum、浪潮KDB、达梦数据库、华三MPP Data Engine、GBase、Hive等;NoSQL包括MongoDB、Redis、HBase、Cassandra等。那么,如何快速的了解或者学习某种数据库?大体可以通过数据库存储结构、数据库逻辑概念和对象结构以及字符集这四个方面快速了解或掌握。
0x01 数据库存储结构
存储结构,从存储设备上划分,可以粗略的划分为两大类:持久性存储(如硬盘、SSD等)和临时性存储(如内存),对应这两类,数据库存储结构可以分为物理结构和内存结构。物理结构简单来说就是在持久性存储设备上可见的、物理存在的文件以及这些文件的用处和相互依存关系,内存结构指的是在内存中存在的数据结构以及这些结构的用处和关系。
如Oracle,物理结构包括控制文件、在线日志文件、数据文件、参数文件等;内存结构包括SGA、PGA等;
如Informix,物理结构包括数据文件、配置文件、物理日志文件等;内存结构包括共享内存端等;
如Sybase,物理结构包括设备文件、配置文件、日志文件等;内存结构包括过程缓冲区、数据缓冲区等。
0x02 数据库逻辑概念
数据库逻辑概念,是对物理结构的逻辑封装,通过增加一系列的概念,便于使用和管理数据库。
如Oracle,表空间Tablespace用于管理物理存储、Segment/Extend/Block用于管理数据存储、User作为容器可用于权限管理和数据库对象存储;
如Teradata,用户User用于数据的存储组织和权限管理、数据库DB在User下用于数据的划分和组织等;
如DB2,表空间Tablespace用于物理存储的管理、User用于权限管理、Schema作为数据库对象的存储容器、BufferPool用于缓存的管理等;
如Mongodb,数据库DB用于存储管理和数据组织、Collection类似数据表作为数据的存储管理;
如Redis,Key/Value键值对,Key可以是根据业务意义自定义的信息,Value可以为任意序列化后的二进制数据或者更高级的Set/List等结构。
0x03 数据库对象结构
数据库对象,指的是数据库Database、用户User、模式Schema、数据表Table、索引Index、约束Constraint、触发器Trigger、存储过程Procedure等对象。通过了解数据库对象结构,也就基本掌握如何通过DML操作数据库了。
如Oracle,在同一台主机上可以有N个数据库,每个数据库中可以有N个User(Schema),每个User下有N张表……,连接数据库后可通过Username.Tablename访问数据表。值得一提的是,在12.2+版本后,增加了所谓的ContainerDB,其实是在DB和User之间加了一层database,实现了类似SQLServer或者Sybase的对象结构;
如DB2,在同一台主机上可以有N个数据库,每个数据库中可以有N个User,每个User下有N个Schema,每个Schema下有N张表……,可通过Schemaname.Tablename访问数据表;
如MySQL,在同一台主机上可以有N个DB Server,每个Server可以有N个DB,每个DB有N个Table,数据表可通过以下方式进行访问:
database <dbname>
select * from <tablename>
如华三MPP Data Engine,数据库对象结构基本与MySQL类似;
如MongoDB,在同一台主机上可以有N个DB Server,每个Server可以有N个DB,每个DB有N个Collection,数据表可通过以下方式进行访问:
use <database>
db.collectionname.find()
0x04 数据库字符集
数据库字符集,在先前文章已有介绍,不再详述。
如Oracle,字符集有ZHS16GBK、AL32UTF8、WE8ISO8859P1等,其中ZHS(中文)/AL(所有)/WE(西欧)等表示语言,16/32/8表示字符存储使用字节数,最后一部分是实际的字符集。
如DB2 LUW,常用字符集有GBK、819(即ISO8859P1)、1208(即Unicode,使用UTF8编码)
如Sybase,常用字符集有EUCGB(即GB2312)、CP850、GB18030、ISO_1(即ISO8859P1)、Roman8(在HP-UX下的默认字符集)
如MySQL,常用字符集有Latin1(即ISO8859P1)、UTF8、GBK
如Teradata,常用字符集有Latin、Unicode(使用UTF16编码)