PostgreSQL 逻辑存储结构


在PostgreSQL数据库系统中,数据的组织结构可以分为三层:
    数据库:一个PostgreSQL数据库服务可以管理多个数据库,当应用连接到一个数据库时,只能访问这个数据库中的数据,而不能访问其他数据库的内容(dblink除外)
    表、索引:一个数据库有很多张表、索引。在PostgreSQL中表的术语是“Relation”,其他数据库叫做“Table”
    数据行:每张表中,有多行数据,行在PostgreSQL中的术语是“Tuple”

tips:1.在PostgreSQL中,一个数据库服务可以有多个数据库,而一个数据库不能属于多个实例,
      2.Oracle数据库中,一个实例只能有一个数据库,但是一个数据库可以在多个实例中(RAC)

数据库基本操作:
    创建......

修改数据库:alter database name [option]

eg:

改变最大连接数:alter database test01 connect  limit 10;

 

 重命名:alter database test01 rename to mydb01;

       改变数据库test01 的配置参数,当某一用户连接到这个用户时,某个参数就设置为一个指定值。
       例如在关闭数据库test01 上默认索引扫描:alter database test01 set enable_indexcan to off;

删除数据库,有以下几种情况需要注意:
     1.当一个数据库不存在,删除命令时也不会报错
     2.如果有人连接到这个数据库,将不能删除该数据库
     3.不能在事务中创建或者删除数据库;可以在事务块中修改数据库

模式
    模式是数据库中的一个概念,可将其理解为命名空间或者目录,不同模式下可以有相同名称的表、函数等对象且互相不冲突,提出模式概念为了方便管理,只要有权限,每个模式的对象可以相互调用。
    使用模式的以下几个原因:

    1.允许多个用户在使用同一数据库时彼此互不干扰
    2.把数据库对象放在不同模式下,组成逻辑单元,便于管理
    3.第三方应用可以放在不同模式,这样就不会和其他对象名字冲突

    创建模式: create schema osdba;
    删除模式: drop   schema osdba;

 

   为用户“osdba”创建模式,名字为“osdba”:create schema  authorization osdba;  

 

 在创建一个模式时,可以在在这个模式下创建一些表的视图:create schema osdba; create table t1(id int,title text)  create table t2(id int,content text)

 

 在模式中可以修改名称和属主: alter schema name rename to newname;   alter schema name owner to newowner

    公共模式:创建或者访问模式中的对象,需要写出受修饰的名字,名字中包含模式以及表名,他们之间用“点”分开: schema_name.table.name
    通常情况下,创创建和访问数据库不需要指定模式,默认为“public” 模式

    模式的搜索路径
    使用的原因:使用数据库对象时,虽可以使用他的全称来定位(schema_name.object_name)很繁琐
    解决的办法:类似于shell中$PATH 环境变量,执行一个shell命令,只有在该命令位于$PATH的目录列表中,可以通过命令直接执行,否则需要输入全路径名称。
        查看模式的搜索路径:show serch_path;
   

    TEST=# SHOW SEARCH_PATH;
         search_path  
        --------------
        benchmarksql
        (1 row)

 模式的权限
    默认情况下,用户无法访问模式中不属于他们的对象;如果要访问,必须在模式上赋予他们"USAGE"权限
    用户可以在别人模式里创建对象,当然需要被赋予在该模式上"CREATE"权限
    默认情况下,每个人"public"模式都有"create" 、"usage"权限,也就是说,允许所有可以连接数据库上的用户可以创建对象了;

    也可以回收权限:revoke create on schema public from     PUBLIC;


    tips:第一个"public" 是模式名称,标识符;  第二个是 所有用户,关键字。在回收以后,其他用户就不能在模式"public" 下创建对象
    
    在Oracle 中,系统不允许创建和他们所有者不同名的模式,实现了标准中规定的基本模式的数据库系统里,模式和用户概念基本一样。
    如果在PostgreSQL中为每个用户创建一个与用户名同名模式,就与oracle兼容。
    
    表的存储属性
    TOAST技术,用于存储大字段的值,PostgreSQL页面大小固定(8KB),并且不允许跨越多个页面,不可能直接存储非常大的字段,为了突破限制,大的字段值通常被压缩或者切片成多个物理行存到另一张系统表。
        每个字段有4种TOAST策略:
        PLAIN:避免压缩或线外存储。对于一些不能TOAST的数据类型可选择此策略
        EXTENDED:允许压缩和线外存储。大多数可以TOAST 的数据类型可选择
        EXTERNA:允许行外存储,不允许压缩。因为没有压缩
        MAIN:允许压缩,但不允许行外存储

    PostgreSQL数据库会为每个可以TOAST数据类型选择一个默认策略,可以用"alter table set storage"改变某个系统默认分配TOAST策略。    
    
    PostgreSQL中,更新一条数据,旧数据行不会被覆盖,而是会插入一条新的数据行,如果块中有空闲空间,则新行直接插入到这个数据块。由于行仍然在这个数据块中,因此使用PostgreSQL 可以使用Heap-Only Tuple技术,
    他会在旧行与新行之间建立一个链表,不需要更新索引。索引仍然会指向旧的行,通过旧行与新行之间的链表,找到新的索引

    临时表
    支持两种临时表:会话级临时表,保存在整个会话的生命周期;事务级临时表:只存在这个事务的生命周期
    在PostgreSQL中,两种临时表,当会话结束,临时表就会消失;在Oracle中,只是临时表数据消失,而临时表还存在
 
    在默认情况下,创建临时表是会话级别的

    create temporary table tmp_t1(id int primary key,note text);


    如果想要创建事务级别临时表
   

create temporary table tmp_t1(id int primary key,note text) on commit  delete rows;


    事实上,"on commit" 有三种形式:
    on commit preserve rows :不带on commit 子名称,默认情况下,数据会存在整个会话周期
    on commit delecte rows:数据只存在事务周期中,事务一提交,数据就消失
    on commit drop:数据值存在事务周期中,事务提交,临时表就消失

    PostgreSQL为和其他数据库创建临时表语句保持兼容性,有"global"和"LOCAL"关键字,但没有任何用处
    
    检查约束: 在设置某个字段里的数值必须使约束表达式为真
    非空约束:声明一个字段不能为NULL
    唯一约束:保证在一个字段或一组字段里的数据相较于表中其他行数据唯一
    外键约束:用于约束表中一个字段或者多个字段数值必须出现在另一个表的一个字段或者多个字段中。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值