数据库中(数据库)database和(模式)schema的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zgcr654321/article/details/82078572

模式(schema)是表、视图等数据库中对象的集合,而数据库(database)是模式的集合。

一个关系数据库管理系统的实例(Instance)中可以建立多个数据库(database);一个数据库中可以建立多个模式(schema);一个模式下通常包括多个表(table)、视图(view)和索引(index)等数据库对象。

在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中。每一个schema对应一个用户,不同的应用可以以不同的用户连接数据库,这样,一个大数据库就可以根据应用把其表分开来管理。不同的schema之间它们没有直接的关系,不同的shcema之间的表可以同名,也可以互相引用(但必须有权限),在没有操作别的schema的操作根权 下,每个用户只能操作它自己的schema下的所有的表。不同的schema下的同名的表,可以存入不同的数据(即schema用户自己的数据)。

一个USER对应一个SCHEMA,该用户的SCHEMA名等于用户名,并作为该用户缺省SCHEMA。

Oracle数据库中不能新创建一个SCHEMA,要想创建一个SCHEMA,只能通过创建一个用户的方法解决。

而在MySQL 5.0.2及更高版本中,CREATE SCHEMA就是CREATE DATABASE的同义词。

对schema我们还要注意以下特点:

可以在不同模式下创建相同表名;

DB2系统访问表对象时使用模式名.表对象的格式;

对于不指明模式的表对象 以当前登录用户模式作为隐含模式访问;

在SQL Server中模式(schema)这个概念是在2005的版本里才提出来的,因此SQL Server2000不支持模式这个概念。在sql server2000中,用户和模式是不分离的。换个角度来说SQL2000中的用户和模式的概念就是为用户分配固定的模式。

在SQL Server2000中,假如我们在某一个数据库中创建了用户Bosco,按么此时后台也为我们默认地创建了默认Schema (Bosco)。Schema的名字和User的名字相同。

在SQL Server2005中,当我们用Create User创建数据库用户时,我们可以为该用户指定一个已经存在的Schema作为默认Schema,如果我们不指定,则该用户所默认的Schema即为dbo Schema,dbo 房间(Schema)好比一个大的公共房间,在当前登录用户没有默认Schema的前提下,如果你在大仓库中进行一些操作,比如Create Tabe,如果没有指定特定的房间(Schema),那么你的物品就只好放进公共的dbo房间(Schema)了。但是如果当前登录用户有默认的Schema,那么所做的一切操作都是在默认Schema上进行(比如当前登录用户为login1,该用户的默认Schema为login1,那么所做的所有操作都是在这个login1默认Schema上进行的)。注意dbo是一个Schema,但是dbo同时也是一个user。

在SQL Server2005中创建一个数据库的时候,会包括一些Schema:dbo,INFORMATION_SCHEMA, guest,sys等等。

当我们在SQL 2005中create table A时,如果没有特定的Schema做前缀,这个A表创建在了哪个Schema上?

这要分以下几种情况:

如果当前操作数据库的用户(可以用Select current_user查出来)有默认的Schema(在创建用户的时候指定了),那么表A被创建在了默认的Schema上。

如果当前操作数据库的用户没有默认的Schema(即在创建User的时候默认为空),但是有一个和用户名同名的Schema,那么表A照样被创建在了dbo Schema上,即使有一个和用户名同名的Schema存在,由于它不是该用户默认的Schema,所以创建表的时候是不会考虑的,当作一般的Schema来处理。

如果在创建表A的时候指定了特定的Schema做前缀,则表A被创建在了指定的 Schema上(前提是权限要够)。

如果登录的用户为Sue,该用户有一个默认Schema也为Sue,那么如果现在有一条查询语句为Select * from mytable, 那么搜寻每个房间(Schema)的顺序如下:

首先搜寻sys.mytable (Sys Schema);

然后搜寻Sue.mytable (Default Schema);

最后搜寻 dbo.mytable (Dbo Schema)。

最好指定特定的Schema前缀,这样数据库就不用去扫描Sys Schema,可以提高查询的速度。

注意:

每个数据库在创建后,有4个Schema是必须的(删都删不掉):dbo,guest,sys和INFORMATION_SCHEMA,其余的Schema都可以删除。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/82078572