数据库Schema两种含义
2010-09-01 17:07
数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。还有一种是物理上的 Schema,指的是数据库中的一个名字空间,它包含一组表、视图和存储过程等命名对象。物理Schema可以通过标准SQL语句来创建、更新和修改。例 如以下SQL语句创建了两个物理Schema
    create schema SCHEMA_A;
create table SCHEMA_A.CUSTOMERS(ID int not null,……);
    create schema SCHEMA_B;
create table SCHEMA_B.CUSTOMERS(ID int not null,……);
简单的说:就是一个数据库用户所拥有的数据库的对象。 
比如scott用户建立了表,索引,视图,存储过程等对象,那么这些对象就构成了schema  scott
数据库schemacatalog简介
    按照SQL标准的解释,在SQL环境下CatalogSchema都属于抽象概念,可以把它们理解为一个容器或者数据库对象命名空间中的一个层次,主要 用来解决命名冲突问题。从概念上说,一个数据库系统包含多个Catalog,每个Catalog又包含多个Schema,而每个Schema又包含多个数 据库对象(表、视图、字段等),反过来讲一个数据库对象必然属于一个Schema,而该Schema又必然属于一个Catalog,这样我们就可以得到该 数据库对象的完全限定名称从而解决命名冲突的问题了;例如数据库对象表的完全限定名称就可以表示为:Catalog名称.Schema名称.表名称。这里 还有一点需要注意的是,SQL标准并不要求每个数据库对象的完全限定名称是唯一的,就象域名一样,如果喜欢的话,每个IP地址都可以拥有多个域名。
    从实现的角度来看,各种数据库系统对CatalogSchema的支持和实现方式千差万别,针对具体问题需要参考具体的产品说明书,比较简单而常用的实现方式是使用数据库名作为Catalog名,使用用户名作为Schema名,具体可参见下表:
1 常用数据库
供应商
Catalog支持
Schema支持
Oracle
不支持
Oracle User ID
MySQL
不支持
数据库名
MS SQL Server
数据库名
对象属主名,2005版开始有变
DB2
指定数据库对象时,Catalog部分省略
Catalog属主名
Sybase
数据库名
数据库属主名
Informix
不支持
不需要
PointBase
不支持
数据库名
    最后一点需要注意的是Schema这个单词,它在SQL环境下的含义与其在数据建模领域中的含义是完全不同的。在SQL环境下,Schema是一组相关的 数据库对象的集合,Schema的名字为该组对象定义了一个命名空间,而在数据建模领域,Schema(模式)表示的是用形式语言描述的数据库的结构;简 单来说,可以这样理解,数据建模所讲的Schema<也就是元数据>保存在SQL环境下相应Catalog中一个Schema<名叫 DEFINITION_SCHEMA>下的表中,同时可以通过查询该Catalog中的另一个Schema<名叫 INFORMATION_SCHEMA>下的视图而获取,具体细节不再赘述。
    另外我结合MySQL官方的MySQL administrater数据库管理工具理解一下所谓的schemacatalog

1 MySql
    点击那个catalogs,下面就出来了所有的database。想了一下,我这样来总结:
    数据库:指的是说MySQL(或者说Oracle等)
    schema 指的是说当偶create database caiceclb时,caiceclb就是一个schema
    catalog 指的是所有的database目录,就像上图显示的那样,将MySQL原来的(mysql,infomation_schema)及后来新建的的database的集合。
SQL Server 数据库 schema 一词的不同含义
我相信一些人在进入精彩的SQL Server世界时,有一些数据库的专业术语可能会导致一些概念的混淆。一个例子就是"schema"这个词的变化。
一般来说,schema 是指数据库表的组织和定义,它们同其它表的关系以及它们所包含的列。通俗点说,它就是数据库的设计。
SQL Server 2000中,schema 是指数据库中的对象的拥有关系(表、视图、存储过程等),它稍微区别于定义一词。对数据库对象的拥有关系是非常重要的,因为对象拥有者是被严格赋予权限 的。如果拥有关系在对象创建的过程中,没有被定义,那么对象的默认拥有者就是数据库的拥有者。在schema中叫"dbo"
SQL Server 2000中,大部分情况下用户和架构的拥有关系是一样的。而在 SQL Server 2005, 数据库对象架构被赋予了一个新的定义,叫“schema”。在这种情况下, schema 就是服务于逻辑对象组的物理数据库对象。对 .NET 开发者来说,它和命名空间的概念非常像。而拥有关系则被从最重要的概念中分离出来,变得更有弹性和可伸缩性。
Database object schemas are a great addition to SQL Server and in many ways is more consistent with the original definition of a schema than it's SQL Server 2000 counterpart.数据库对象架构已经成为SQL Server 的非常重要的一部分,很多情况下,它相比于SQL Server 2000中的概念来说,与初始的架构定义显得更一致。
作者: Johnm
深入讲解数据库中UserSchema的关系
       假如我们想了解数据库中的UserSchema究竟是什么关系,首先必须了解一下数据库中UserSchema到底是什么概念。
       SQL Server2000中,由于架构的原因,UserSchema总有一层隐含的关系,让我们很少意识到其实UserSchema是两种完全不同的概念,不过在SQL Server2005中这种架构被打破了,UserSchema也被分开了。
首先我来做一个比喻,什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们可以可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了J。,然后床上可以放置很多物品,就好比Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),其实User是对应与数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操
作数据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个Schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,呵呵,和现实也太相似了吧。我还可以给User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角Role了,至于分配权限的问题,我留在以后单独的blog中详述。比喻到这里,相信大家都清楚了吧。
SQL Server2000中,假如我们在某一个数据库中创建了用户Bosco,按么此时后台也为我们默认地创建了默认Schema Bosco】。Schema的名字和User的名字相同,这也是我们分不清楚用户和Schema的原因。
SQL Server2005中,为了向后兼容,当你用sp_adduser 存储过程创建一个用户的时候,SQL Server2005同时也创建了一个和用户名相同的Schema,然而这个存储过程是为了向后兼容才保留的,我们应该逐渐熟悉用新的DDL语言Create UserCreate Schema来操作数据库。在SQL Server2005中,当我们用Create User创建数据库用户时,我们可以为该用户指
定一个已经存在的Schema作为默认Schema,如果我们不指定,则该用户所默认的Schema即为dbo Schemadbo 房间(Schema)好比一个大的公共房间,在当前登录用户没有默认Schema的前提下,如果你在大仓库中进行一些操作,比如Create Tabe,如果没有指定特定的房间(Schema),那么你的物品就只好放进公共的dbo房间(Schema)了。但是如果当前登录用户有默认的Schema,那么所做的一切操作都是在默认Schema上进行(比如当前登录用户为login1,该用户的默认Schemalogin1,那么所做的所有操作都是在这个login1默认Schema上进行的。实验已经证明的确如此)。估计此时你会有一点晕,为什么呢?我刚才说dbo是一个Schema,但是你可以在数据库中查看到,dbo同时也是一个user,晕了吧,呵呵。
SQL Server2005中创建一个数据库的时候,会有一些Schema包括进去,被包括进去的Schema有:dboINFORMATION_SCHEMA, guestsys等等(还有一些角Schema,不提了,有晕了)。
我在上文中已经提到了,在SQL Server2005中当用存储过程sp_adduser创建一个user时,同时SQL Server2005也为我们创建了一个默认的和用户名相同的Schema,这个时候问题出
来了,当我们create table A时,如果没有特定的Schema做前缀,这个A表创建在了哪个Schema上,即进入了哪个房间?答案是:
1.如果当前操作数据库的用户(可以用Select current_user查出来)有默认的Schema(在创建用户的时候指定了),那么表A被创建在了默认的Schema上。
2.如果当前操作数据库的用户没有默认的Schema(即在创建User的时候默认为空),但是有一个和用户名同名的Schema,那么表A照样被创建在了dbo Schema上,即使有一个和用户名同名的Schema存在,由于它不是该用户默认的Schema,所以创建表的时候是不会考虑的,当作一般的Schema来处理,别看名字相同,可是没有任何关系哦。
3.如果在创建表A的时候指定了特定的Schema做前缀,则表A被创建在了指定的 Schema上(有权限吗?)
现在问题又出来了,在当前操作数据库的用户(用select current_user可以查看到,再次强调)没有默认数据库简单吗Schema的前提下,当我们用Create table A语句时,A表会去寻dbo Schema,并试图创建在dbo Schema上,但是如果创建A表的用户只有对dbo Schema的只
读权限,而没有写的权限呢?这个时候A表既不是建立不成功,这个就是我以后会提及到的Login,User, RoleSchema四者之间的关系。在这里,为了避免混淆和提高操作数据库的速度(在少量数据范围内,对我们肉眼来说几乎看不到差异),我们最好每次在操作数据库对象的时候都显式地指定特定的Schema最为前缀。
现在如果登录的用户为Sue,该用户有一个默认Schema也为Sue,那么如果现在有一条查询语句为Select * from mytable, 那么搜寻每个房间(Schema)的顺序是怎样的呢?顺序如下:
1. 首先搜寻able Sys Schema
2. 然后搜寻able (Default Schema)
3. 最后搜寻 able (Dbo Schema)
执行的顺序大家既然清楚了,那么以后在查询数据库表中的数据时,最好指定特定的Schema前缀,这样子,数据库就不用去扫描Sys Schema了,当然可以提高查询的速度了。
另外需要提示一下的是,每个数据库在创建后,有4Schema是必须的(删都删不掉),这4Schema为:dboguestsysINFORMATION_SCHEMA,其余的Schema都可以删除。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。