本文参考:http://blog.csdn.net/kanon_lgt/article/details/5931522sql
http://blog.csdn.net/kanon_lgt/article/details/6220928数据库
DB实例与schema: 模式是数据库实例的逻辑分割。架构
数据库是被模式(schema)来切分的,一个数据库至少有一个模式,全部数据库内部的对象(object)是被建立于模式的。用户登陆到系统,链接到一个数据库后,是经过该数据库的search_path来寻找schema的搜索顺序:post
能够经过命令SHOW search_path;来查看具体搜索顺序(默认以下):spa
postgres=# show search_path; search_path ---------------- "$user",public
也能够经过SET search_path TO 'schema_name'来修改顺序。.net
能够经过\d 表名 来查看表所属的模式:设计
postgres=# \d test 资料表"postgres.test" 栏位 | 型别 | 修饰词 ------+---------+-------- id | integer |
官方建议是这样的:在管理员建立一个具体数据库后,应该为全部能够链接到该数据库的用户分别建立一个与用户名相同的模式,而后,将search_path设置为"$user"(即缺省模式为与用户名相同的模式),这样,任何当某个用户链接上来后,会默认将查找或者定义的对象都定位到与之同名的模式中。这是一个好的设计架构。
code
角色(role)与用户(user):对于PostgreSQL来讲,这是彻底相同的两个对象。orm
惟一的区别是在建立的时候:对象
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 tablespaces Name | Owner | Location -----------+----------+----------------------------------- pg_default | postgres | pg_global | postgres | ts_licai | kanon | D:/PostgreSQL90/TableSpc/ts_licai
仔细分析后,不可贵出结论:在PostgreSQL中,表空间是一个目录,里面存储的是它所包含的数据库的各类物理文件。
总结:
表空间是一个存储区域,在一个表空间中能够存储多个数据库,尽管PostgreSQL不建议这么作,但咱们这么作彻底可行。
一个数据库并不直接存储表结构等对象的,而是在数据库中逻辑建立了至少一个模式,在模式中建立了表等对象,将不一样的模式指派给不一样的角色,能够实现权限分离,又能够经过受权,实现模式间对象的共享,而且,还有一个特色就是:public模式能够存储你们都须要访问的对象。
一个表在建立的时候能够指定表空间,那么,是否能够给一个表指定它所在的数据库表空间以外的表空间呢?答案是确定的!这么作彻底能够:那这不是违背了表属于模式,而模式属于数据库,数据库最终存在于指定表空间这个网的模型了吗?!是的,看上去这确实是不合常理的,但这么作又是有它的道理的,并且现实中,咱们每每须要这么作:将表的数据存在一个较慢的磁盘上的表空间,而将表的索引存在于一个快速的磁盘上的表空间。
但咱们再查看表所属的模式仍是没变的,它依然属于指定的模式。因此这并不违反常理。实际上,PostgreSQL并无限制一张表必须属于某个特定的表空间,咱们之因此会这么认为,是由于在关系递进时,偷换了一个概念:模式是逻辑存在的,它不受表空间的限制。