关于数据库模式切换问题

现在流行的数据库都有 Schema 的概念,一般作为数据库对象(表,函数,存储过程
等)的命名空间。所以在数据库端往往存在实例/数据库/Schema 这样层级划分。对于
DB2 和 Oracle 用客户端创建一个新的数据库并非易事,灵活的在数据库中较轻量的
划分隔离空间的办法因数据库类型而异。
MySQL: Mysql 的体系架构是单实例多库,一个用户可以访问多个数据库,然后指
定当前数据库写 SQL 的时候就不用带上数据库名,MySQL 中 database 和 schema
是一个概念,它靠 database 来隔离数据库对象。创建数据库(create database),
create schema 是 create database 的别名。
PostgreSQL: create database 创建新的数据库,或在当前数据库下用 create
schema 创建 schema。PostgreSQL 的函数或存储过程中对未指定 schema 的数据库
对象的访问的规则是在调用时动态绑定到当前会话中的 schema。
达梦 8: 达梦的体系架构是单库多实例的,也就是没有多个数据库的概念,从 Mysql
转到达梦,就需要建多个用户+表空间来对应 Mysql 的多个数据库。每个用户有一
个默认的同名的模式,访问自己模式下的表、视图等不需要加模式名,访问其他模
式下的对象需要加上模式名。
Oracle: create schema 较麻烦,涉及到 authorization。但可以通过 create user 创建
新用户后就有了对应的新 schema。Oracle 中采取用户来隔离数据库对象。
实际应用过程中研发交付团队可能使用模式来进行租户间的数据隔离或根据业务功
能划分不同的模式,这里就涉及一个服务需要同时连接并查询多种模式的问题,一
种方案是直接在 sql 中的表名前添加模式名前缀,这种适合一句 sql 需要跨多个模式
进行联合查询的场景,属于定制型 sql。一种方案是在会话层面指定模式,这样 sql
中的表名不需要指定默认的前缀,对于不在当前模式下的表才需要添加模式前缀,
这种适合多模式下相同表名存储数据的切换。
MySQL 的连接串直接指定具体数据库,其实已经是会话层面的模式切换
PostgreSQL 的连接串在没有指定当前模式下,例如
jdbc:postgresql://localhost:5432/postgresql 默认使用的是 postgresql 数据库的 public
模式。
PostgreSQL 从 9.4 版本开始通过关键字 currentSchema 指定模式
jdbc:postgresql://localhost:5432/postgresql?currentSchema=myschema
旧版本通过 searchpath 指定
jdbc:postgresql://localhost:5432/postgresql?searchpath=myschema
达梦 8 的连接串在没有指定当前模式时,使用的是与用户同名的模式,可通过
scheme 指定当前模式,例如:
jdbc:dm://localhost:5236?schema=myschema

你可能感兴趣的:(数据库,postgresql,mysql)