金仓KingbaseES逻辑架构,与Oracle/MySQL对比
KingbaseES的逻辑结构
KingbaseES的逻辑结构采用层级式设计,从高到低依次为:实例/集簇 → 数据库(Database) → 模式(Schema) → 数据库对象(表/视图/函数等),其中多个数据库可以共享同一实例但它们之间相互隔离,模式作为命名空间管理对象,用户和角色全局统一管理权限。
数据库实例 (Instance/Cluster)
├── 全局用户/角色 (Global Users/Roles)
├── 实例配置 (Instance Config)
├── 共享内存 & 后台进程 (Shared Memory & Background Processes)
├── 事务日志 (WAL)
│
├── 数据库 (Database) 1 (e.g., `mydb`)
│ ├── 数据库配置 (DB Config)
│ ├── 模式 (Schema) 1 (e.g., `public`)
│ │ ├── 表 (Table) A
│ │ ├── 视图 (View) B
│ │ ├── 索引 (Index) on A
│ │ └── 函数 (Function) C
│ │
│ ├── 模式 (Schema) 2 (e.g., `sales`)
│ │ ├── 表 (Table) Orders
│ │ └── 表 (Table) Customers
│ │
│ └── **模式分组 (Schema Group)** `sales_group` (包含 `sales`, `inventory`)
│
├── 数据库 (Database) 2 (e.g., `testdb`)
│ └── ... (Schemas, Objects)
│
└── 系统数据库 (System Database) (e.g., `sysdatabase`)
└── 系统目录 (System Catalogs) (存储全局元数据)
数据库实例 (Database Instance / Cluster)
定义: 这是KingbaseES运行时的最高层逻辑结构。一个实例代表一个独立的KingbaseES服务器进程及其管理的所有内存结构和后台进程。
内容: 一个实例管理着多个数据库(Databases)、全局的用户/角色信息、实例级的配置参数、共享内存区域、后台进程(如写进程、检查点进程、归档进程等)以及事务日志(WAL)。
关键点: 连接到KingbaseES时,首先连接到一个具体的实例。不同数据库实例之间通常是物理隔离的。
数据库 (Database)
定义: 数据库是存储在数据库实例中的、逻辑上独立的数据集合。它是用户或应用程序访问数据的主要入口点。
内容: 一个数据库包含:
多个模式(Schemas)
该数据库特有的配置(如默认搜索路径、字符集、排序规则等)。
属于该数据库的用户/角色权限信息(虽然用户/角色定义在实例级,但权限授予在数据库对象级)。
关键点:
不同数据库在物理存储上是分开的(有各自的系统目录、表空间映射)。
客户端连接必须指定一个具体的数据库 (如使用
\c mydb
或连接字符串指定)。默认情况下,一个数据库中的对象(如表)不能直接访问另一个数据库中的对象(跨库查询需要特殊机制如
dblink
或postgres_fdw
扩展)。常见的系统数据库:
template0
,template1
(用作创建新数据库的模板),sysdatabase
(KingbaseES的系统数据库,存储全局元数据,通常不直接操作)。
模式 (Schema)
定义: 模式是数据库内部的一个命名空间,用于组织和管理数据库对象(如表、视图、索引、函数、序列、类型等)。它提供了对象名称的第二层逻辑隔离。
作用:
避免命名冲突: 不同模式下的对象可以同名(如
sales.orders
和hr.orders
)。逻辑分组: 将属于同一应用、模块或用户的对象组织在一起(如
finance
,inventory
,reporting
)。权限管理: 权限可以授予到整个模式级别(如
GRANT USAGE ON SCHEMA myschema TO myrole;
),方便批量授权。
关键点:
每个数据库都至少有一个模式,通常是
public
(默认创建,如果未指定模式名,对象通常创建在此)。用户可以创建多个模式。
搜索路径 (search_path): 是一个配置参数(可在会话级设置),指定了当使用非限定对象名(如
SELECT * FROM orders;
)时,数据库按顺序查找对象的模式列表。例如SET search_path TO myschema, public;
会先在myschema
找orders
表,找不到再去public
找。KingbaseES特有:模式分组 (Schema Group): 这是KingbaseES的一个重要扩展特性。它允许将多个模式逻辑上组合成一个组。对组的授权(如
GRANT USAGE ON SCHEMA GROUP mygroup TO myrole;
)会自动授予该组内所有模式的USAGE
权限。这极大地简化了跨多个模式的对象管理和权限控制,尤其适合多租户或大型复杂应用。
数据库对象 (Database Objects)
定义: 存储在特定模式中的实际数据结构或程序单元。
主要类型:
表 (Table): 存储数据的基本结构,由行(记录)和列(字段)组成。
视图 (View): 基于一个或多个表的查询结果集的虚拟表。不存储实际数据。
索引 (Index): 提高数据检索速度的数据结构(如 B-tree, Hash, GiST, GIN)。
序列 (Sequence): 生成唯一的整数序列,常用于主键自增。
函数 (Function): 可重用的 SQL 或过程化语言(如 PL/SQL, PL/pgSQL)代码块。
存储过程 (Procedure): (KingbaseES兼容支持) 执行特定操作的程序单元,可能不返回值(标准SQL区分函数和过程)。
触发器 (Trigger): 在表上发生特定事件(INSERT/UPDATE/DELETE)时自动执行的函数。
类型 (Type): 自定义数据类型(复合类型、枚举类型等)。
同义词 (Synonym): (KingbaseES兼容支持) 为数据库对象(如表、视图、另一个同义词等)提供别名。
包 (Package): (KingbaseES兼容Oracle/PLSQL特性) 将相关的函数、过程、变量、类型、游标等封装在一起的逻辑单元。
访问方式: 对象通常使用 限定名 访问:
[database_name.][schema_name.]object_name
。在连接上下文已知数据库、search_path
已知模式或使用默认值时,可以省略部分限定。
用户与角色 (Users & Roles)
定义: 用于控制对数据库实例及其对象的访问权限。
用户 (User): 通常指可以登录到数据库实例并进行操作的个体账号(包含登录权限的角色)。
CREATE USER
等同于CREATE ROLE ... LOGIN
。角色 (Role): 权限的集合。角色可以分配给用户或其他角色(实现权限继承)。
关键点:
用户和角色在KingbaseES中本质上都是“角色”,区别在于是否具有
LOGIN
属性。权限通过
GRANT
和REVOKE
命令管理,可以授予到数据库、模式、模式组或具体对象上。PUBLIC
是一个特殊的角色,代表所有用户。授予PUBLIC
的权限对所有用户生效。
系统目录 (System Catalogs)
定义: KingbaseES内部用于存储元数据(Metadata) 的特殊表和视图。
内容: 存储了关于数据库本身的所有信息:有哪些数据库、每个数据库中有哪些模式、每个模式中有哪些对象(表、视图、索引...)、这些对象的定义、用户/角色信息、权限信息、统计信息等。
位置: 通常位于每个数据库的
sys_catalog
模式(或类似名称,具体名称可能因版本或安装配置略有差异)下。系统数据库sysdatabase
存储了实例级的全局信息。访问: 可以通过SQL查询系统目录视图(如
sys_class
- 所有表/索引等对象,sys_tables
- 表,sys_views
- 视图,sys_indexes
- 索引,sys_users
/sys_roles
- 用户/角色,sys_namespace
- 模式等)来获取元数据信息。这些视图是理解和管理数据库逻辑结构的关键工具。
KingbaseES与Oracle/MySQL的对比
KingbaseES | Oracle | MySQL | |
---|---|---|---|
数据库连接 | 连接时必须指定具体的数据库。同实例内不可以跨库访问。 | 连接时必须指定具体的数据库。同实例内不可以跨库访问。 | 连接时不必要指定具体的数据库。同实例内可以跨库访问。 |
数据库和模式的关系 | 一对多 一个数据库中可以有多个模式 | 一对多 一个数据库中可以有多个模式 | 一对一 可以认为数据库等同于模式 |
数据库和用户的关系 | 多对多 用户是实例全局的。用户可以操作不同数据库中的对象。 | 一对多 用户是隶属于具体数据库的(除sys和system用户外),一个数据库下的用户不能连接到其他数据库。不同数据库中可以有同名用户。 | 多对多 用户是实例全局的。用户通过用户名+主机名的方式来区分。用户可以操作不同数据库中的对象。 |
模式和用户的关系 | 多对多 模式和用户不等价 | 一对一 模式和用户等价 | 多对多 模式和用户不等价 |
用户和角色的关系 | 用户和角色是实例全局的。用户和角色基本等价,用户默认可登录,角色默认不可登录,但都可以回收或授予登录权限。用户和角色都可以拥有数据库对象和获得权限。用户和角色都可以通过继承的方式将权限传递给其他用户/角色。 | 用户和角色是隶属于具体数据库的。用户是实体,可以拥有数据库对象和权限。角色是用户的抽象表示,不能登录数据库,不能拥有数据库对象,只能获得权限。可以将角色授予用户,使用户获得角色的权限。 | 用户和角色是实例全局的。用户是实体,可以拥有数据库对象和权限。角色是用户的抽象表示,不能登录数据库,不能拥有数据库对象,只能获得权限。可以将角色授予用户,使用户获得角色的权限。 |
默认查询路径 | 通过search_path指定。 | 和当前用户同名。 | 和当前数据库同名。 |