一.什么是Schema

我们可以可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了。然后床上可以放置很多物品,就好比Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),其实User是对应与数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操作数据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个Schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,呵呵,和现实也太相似了吧。






二.Schema适用范围

schema 是用于 在一个 大项目中的 各个 小项目
每个 小项目的表, 放在 各自的 schema 下面.
这样, 遇到 小项目里面. 有 相同名字的 表的话, 不会发生冲突.
例如一个 公司的 系统.
里面分2个 子系统, 分别为 财务系统 和 人力资源系统.
这2个 子系统, 共用一个数据库
.那么 财务系统的表, 可以放在 财务的 schema.
人力资源系统的表,放在 人力资源系统的模式里面。
这2个 子系统, 能够 互相访问 对方的表
但是又不因为 表重名 的问题,影响对方。



三。使用语法(sql)

create  schema  rabbit  --创建一个叫rabbit的架构
ALTER SCHEMA [rabbit] TRANSFER HumanResources.Department  --将一个叫HumanResources架构下的表转到一个叫rabbit架构下
drop schema rabbit--删除一个叫rabbit的架构,注意如果该架构下存在表,
                  --请先删掉该架构下的表,或者将表转移到其他架构,否则删除失败!
create  schema  rabbit  --创建一个叫rabbit的架构
ALTER SCHEMA [rabbit] TRANSFER HumanResources.Department  --将一个叫HumanResources架构下的表转到一个叫rabbit架构下
drop schema rabbit--删除一个叫rabbit的架构,注意如果该架构下存在表,
                  --请先删掉该架构下的表,或者将表转移到其他架构,否则删除失败!



四。效果图

这样看起来每个表名都带有前缀是不是更方便管理呢?

五。注意的地方

          我们最好每次在操作数据库对象的时候都显式地指定特定的Schema最为前缀。 现在如果登录的用户为Sue,该用户有一个默认Schema也为Sue,那么如果现在有一条查询语句为Select * from mytable, 那么搜寻每个房间(Schema)的顺序是怎样的呢?顺序如下: 1. 首先搜寻sys.mytable (Sys Schema) 2. 然后搜寻Sue.mytable (Default Schema) 3. 最后搜寻 dbo.mytable (Dbo Schema) 执行的顺序大家既然清楚了,那么以后在查询数据库表中的数据时,最好指定特定的Schema前缀,这样子,数据库就不用去扫描Sys Schema了,当然可以提高查询的速度了。 另外需要提示一下的是,每个数据库在创建后,有4个Schema是必须的(删都删不掉),这4个Schema为:dbo,guest,sys和INFORMATION_SCHEMA,其余的Schema都可以删除。

所以查询最后就这样写:


select * from rabbit.department ;