联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
玩多了Oracle,习惯了使用Oracle的体系架构去对比别的数据库,今天看PostgreSQL发现两者明显不一样:
1. 在数据库/表空间/schema三者关系上的区别
表空间是物理结构,同一表空间下可以有多个数据库
数据库是逻辑结构,是表/索引/视图/存储过程的集合,一个数据库下可以有多个schema
模式是逻辑结构,是对数据库的逻辑划分
2. 在oracle中用户和schema基本上可以画上等同关系,但是pg中两者没有这样严格的对应关系
相关测试实验
创建用户
在pg中role比user少login,其他基本上相同(也就是说如果给role授权login,等同user)
postgres=# CREATE USER u_xifenfei WITH postgres-# LOGIN postgres-# SUPERUSER postgres-# CREATEDB postgres-# CREATEROLE postgres-# INHERIT postgres-# REPLICATION postgres-# CONNECTION LIMIT -1 postgres-# PASSWORD 'xifenfei'; CREATE ROLE
创建表空间
postgres=# CREATE TABLESPACE tbs_xifenfei postgres-# OWNER u_xifenfei postgres-# LOCATION 'D:\Program Files\PostgreSQL\tbs_xifenfei'; CREATE TABLESPACE
创建数据库
postgres=# CREATE DATABASE db_xifenfei postgres-# WITH postgres-# OWNER = u_xifenfei postgres-# ENCODING = 'UTF8' postgres-# TABLESPACE = tbs_xifenfei postgres-# CONNECTION LIMIT = -1; CREATE DATABASE
查询数据库和表空间信息
postgres=# select oid, datname, datlastsysoid, dattablespace postgres-# from pg_catalog.pg_database order by 1,2; oid | datname | datlastsysoid | dattablespace -------+-------------+---------------+--------------- 1 | template1 | 12937 | 1663 12937 | template0 | 12937 | 1663 12938 | postgres | 12937 | 1663 16407 | db_xifenfei | 12937 | 16406 (4 行记录) postgres=# select oid,* from pg_catalog.pg_tablespace; oid | spcname | spcowner | spcacl | spcoptions -------+--------------+----------+--------+------------ 1663 | pg_default | 10 | | 1664 | pg_global | 10 | | 16406 | tbs_xifenfei | 16405 | | (3 行记录)
使用u_xifenfei用户登录
C:\Users\Administrator>psql -U u_xifenfei -d db_xifenfei 用户 u_xifenfei 的口令: psql (10.4) 输入 "help" 来获取帮助信息. db_xifenfei=# \c 您现在已经连接到数据库 "db_xifenfei",用户 "u_xifenfei".
创建测试表
db_xifenfei=# create table t_xifenfei as select * from pg_database; SELECT 5 db_xifenfei=# select pg_relation_filepath('t_xifenfei'); pg_relation_filepath --------------------------------------------- pg_tblspc/16406/PG_10_201707211/16407/16408 (1 行记录) db_xifenfei=# insert into t_xifenfei select * from t_xifenfei; INSERT 0 5 ………… db_xifenfei=# insert into t_xifenfei select * from t_xifenfei; INSERT 0 327680 db_xifenfei=# select count(*) from t_xifenfei; count --------- 1310720 (1 行记录)
这里可以发现,创建表空间其实对应的是一个文件夹路径,创建数据库是在对应的表空间中创建相关目录和文件,创建表是对应的相关文件.
参考:PostgreSQL tablespace database schema