2019独角兽企业重金招聘Python工程师标准>>>

本文参考:http://blog.csdn.net/kanon_lgt/article/details/5931522

http://blog.csdn.net/kanon_lgt/article/details/6220928

DB实例与schema: 模式是数据库实例的逻辑分割。

数据库是被模式(schema)来切分的,一个数据库至少有一个模式,所有数据库内部的对象(object)是被创建于模式的。用户登录到系统,连接到一个数据库后,是通过该数据库的search_path来寻找schema的搜索顺序:

可以通过命令SHOW search_path;来查看具体搜索顺序(默认如下):

postgres=# show search_path;search_path
----------------"$user",public

也可以通过SET search_path TO 'schema_name'来修改顺序。

可以通过\d 表名 来查看表所属的模式:

postgres=# \d test资料表"postgres.test"栏位 | 型别 | 修饰词
------+---------+--------
id   | integer |

官方建议是这样的:在管理员创建一个具体数据库后,应该为所有可以连接到该数据库的用户分别创建一个与用户名相同的模式,然后,将search_path设置为"$user"(即缺省模式为与用户名相同的模式),这样,任何当某个用户连接上来后,会默认将查找或者定义的对象都定位到与之同名的模式中。这是一个好的设计架构。

角色(role)与用户(user):对于PostgreSQL来说,这是完全相同的两个对象。

唯一的区别是在创建的时候:

CREATE ROLE kanon PASSWORD 'kanon';   --(ROLE创建时缺省不具有LOGIN权限)
CREATE USER kanon PASSWORD 'kanon2';  --(USER创建时缺省就具备了LOGIN权限)
CREATE ROLE kanon PASSWORD 'kanon' LOGIN;
---等同于
CREATE USER kanon PASSWORD 'kanon';

ROLE不具有缺省的LOGIN权限,这就是ROLE/USER的区别。

表空间与数据库:一个表空间可以存储多个数据库(虽然不建议如此,但却是可行的)

 数据库创建语句CREATE DATABASE dbname 默认的数据库所有者是当前创建数据库的用户,默认的表空间是系统的默认表空间--pg_default。

在PostgreSQL中,数据库的创建是通过克隆数据库模板来实现的,这与SQL SERVER是同样的机制。CREATE DATABASE dbname并没有指明数据库模板,所以系统将默认克隆缺省的template1数据库。而template1数据库的默认表空间是pg_default,这个表空间是在数据库初始化时创建的,所以所有template1中的对象将被同步克隆到新的数据库中。

数据库创建时相对完整的语法应该是:

CREATE DATABASE dbname OWNER kanon TEMPLATE template1 TABLESPACE tablespacename;

表空间的概念:表空间就是一个简单的目录,其主要用途分两个:

1.单独扩展表空间用,一旦磁盘或分区被耗尽,可以创建一个表空间到其他磁盘或分区上面。
    2.区分不同对象的存储位置,比如可将索引放入较快磁盘的表空间上,而将固定不变的数据放入较慢磁盘的表空间上。
    与Oracle数据库中的表空间被独占不同,PostgreSQL的表空间是可以被共享的。当创建了一个表空间后,这个表空间可以被多个数据库、表、索引等数据库对象使用。达到对象的分离与归类的目的。
在PostgreSQL中有两个系统自建表空间:pg_global和pg_default。

前者是系统全局表空间,存储了关键的共享系统目录。后者是系统全局表空间,存储了关键的共享系统目录。
后者是系统默认表空间,可通过set default tablespace=tablespacename来指定为其他表空间,在建立数据库、表、索引等数据库对象时,若不指定表空间参数,则系统自动将对象创建到默认表空间中。如create table tt(id int) tablespace space1.该语句等价于set default tablespace=space1;create table tt(id int);

tablespace的记录存储在系统数据库postgrse的pg_tablspace表中,可以使用命令/db 或者sql语句select * from pg_tablespace命令查看。

                   List of tablespacesName    |  Owner   |             Location
-----------+----------+-----------------------------------
pg_default  | postgres  |
pg_global   | postgres   |
ts_licai    | kanon       | D:/PostgreSQL90/TableSpc/ts_licai

仔细分析后,不难得出结论:在PostgreSQL中,表空间是一个目录,里面存储的是它所包含的数据库的各种物理文件。

  总结:

表空间是一个存储区域,在一个表空间中可以存储多个数据库,尽管PostgreSQL不建议这么做,但我们这么做完全可行。

一个数据库并不直接存储表结构等对象的,而是在数据库中逻辑创建了至少一个模式,在模式中创建了表等对象,将不同的模式指派给不同的角色,可以实现权限分离,又可以通过授权,实现模式间对象的共享,并且,还有一个特点就是:public模式可以存储大家都需要访问的对象。

一个表在创建的时候可以指定表空间,那么,是否可以给一个表指定它所在的数据库表空间之外的表空间呢?答案是肯定的!这么做完全可以:那这不是违背了表属于模式,而模式属于数据库,数据库最终存在于指定表空间这个网的模型了吗?!是的,看上去这确实是不合常理的,但这么做又是有它的道理的,而且现实中,我们往往需要这么做:将表的数据存在一个较慢的磁盘上的表空间,而将表的索引存在于一个快速的磁盘上的表空间。

但我们再查看表所属的模式还是没变的,它依然属于指定的模式。所以这并不违反常理。实际上,PostgreSQL并没有限制一张表必须属于某个特定的表空间,我们之所以会这么认为,是因为在关系递进时,偷换了一个概念:模式是逻辑存在的,它不受表空间的限制。

转载于:https://my.oschina.net/liuyuanyuangogo/blog/497272

PostgreSQL中的数据库实例、模式、用户(角色)、表空间相关推荐

  1. oracle数据库_实例_用户_表空间之间的关系

    oracle数据库_实例_用户_表空间之间的关系 基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制 ...

  2. 查看Oracle数据库所有的用户及表空间等

    查看所有用户:select * from all_users; 查看表空间:select tablespace_name from dba_tablespaces; 查看用户具有怎样的角色:selec ...

  3. SQLPLUS登录以及切换Oracle数据库实例和用户

    最近刚接触了Oracle数据库,刚入门的时候,经常都是使用SQL Developer进行数据库实例以及用户的登录,很少使用SQLPLUS来对数据库进行操作,但是数据库服务器通常是运行在Linux环境之 ...

  4. Oracle新建数据库和用户及表空间

    1. Oracle安装完成 ,如果在安装的时候选择了新建数据库实例,那么安装完之后可以用默认的实例,如果没有安装或者希望用新的数据库实例,可以用'Database Configuration Assi ...

  5. 企业实战03:Oracle数据库_用户和表空间

    Oracle数据库专栏 命令后面可以不加;分号 SQL语句后面一定要加;分号 文章目录 用户和表空间 2-1 使用系统用户登录Oracle 系统用户 2-2 Oracle用户和表空间之查看登录用户 2 ...

  6. oracle 视图 其他用户,oracle创建视图中涉及到另外一个用户的表权限不足问题

    oracle创建视图中涉及到另外一个用户的表权限不足问题 在oracle中存储过程或者视图等对象创建时,如果涉及到另外一个用户的表,即使你已经grant dba了,也不行,必须显式地赋予查询权限.否则 ...

  7. Oracle 数据库创建表空间、创建用户指定表空间

    Oracle 数据库创建表空间.创建用户指定表空间 //创建临时表空间 create temporary tablespace user_temp tempfile 'D:\oracle\oradat ...

  8. oracle命令清空数据库表,Oracle中如何快速删除数据字典管理的表空间-数据库专栏,ORACLE...

    我的测试环境:hp rp7410主机,hp-unix11.11 os,oracle8.1.7.4的数据库,一个有90张表大约100g的测试表空间tbs_test. 问题的提出:oracle中在使用dr ...

  9. 达梦数据库查询模式名,表名,字段名

    达梦数据库查询模式名,表名,字段名 查询所有的模式名 SELECT DISTINCT object_name FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'SCH' 根据 ...

最新文章

  1. 为何说“内容+社交”是奥运发展化趋势?
  2. 实现MFC中Radio Button组绑定同一变量控制
  3. Linux基金会宣布开发区块链技术的新团队
  4. Python 3基础教程32-正则
  5. VTK:参数样条用法实战
  6. 事故现场之依赖了不该依赖的 host ip
  7. bootstrap组件的案例代码
  8. d3 mysql_javascript – 在d3可视化中访问MySQL数据库
  9. python编程( 第一份Windows平台运行的python代码)
  10. 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。
  11. 求集合的所有子集问题
  12. 【HDOJ7079】Pty loves lines(计算直线的交点方案数,打表)
  13. ubuntu14下搭建ssdb主从环境
  14. matlab 脚本文件 函数,Matlab 脚本文件script和函数文件function的区别
  15. docx文档文字怎么加边框,WORD文档给文字加的边框,如何调大小
  16. X.509证书与java
  17. (2015年度)黑龙江测绘地理信息局青年学术和技术带头人考评与增选公示
  18. php实时股票,PHP实现股票趋势图和柱形图
  19. (六十二)基于logistic回归的信用评级和分类模型评估
  20. 图片转svg并动态修改其颜色

热门文章

  1. 商汤等提出:统一多目标跟踪框架
  2. 深度学习笔记七:循环神经网络RNN(基本理论)
  3. 综述丨七场高端报告,带你大视角看人工智能发展
  4. 通用AI咋发展?向大脑学习是条路子
  5. 缅怀袁隆平院士:一颗稻谷里的爱国情怀
  6. 解密脑机接口:专访CMU生物医学工程系主任贺斌
  7. 我们对时间的理解错了吗?
  8. 中国独角兽企业总榜发布:百亿超级独角兽达13家(附榜单)
  9. 看懂GE Predix ,就看懂了工业互联网
  10. 美国12大科技公司如何参与自动驾驶?