数据库的一些基本概念

数据库的一些基本概念

oracle/db2/sqlserver/sybase等数据库中,都有着实例(instance)/用户(user)/角色(role)/架构(schema)/表空间(tablespace)等等概念。不同数据库中,这些名词的含义虽大同,亦有小异。

1. 数据库(database)与实例(instance)

实例和数据库,是数据库系统中最大、最外层的两个对象,几乎所有类型的数据库都使用了这两个概念。

1.1 数据库

数据库(database)是数据的集合,使用一定的形式组织/管理内部的数据。所有数据对象(表/用户/类型/表空间/架构/操作日志)等等都属于数据库的组成部分。数据库占用一定的存储空间,常以文件的形式存放在磁盘空间上;数据库服务运行时,存储在磁盘上的数据会被按需加载到内存当中。

如果用一座图书馆来类比的话,数据库就是图书馆中的图藏书大楼及其中的物体,如大楼/书籍/书架,人员信息, 用来提供各种相关功能的工具等等。

1.2 实例

实例(instance),用来独立提供数据服务的一组进程和资源(内存/数据等)的集合,数据库作为数据源包含于实例之中。尽管多个实例间可能会共用一些模块,但每个实例拥有自己的配置和资源,相互之间独立。

一个实例就是一个处于运行状态的图管馆系统,内有图书大厦(数据库),可以为读者/用户提供书籍借阅等服务,也可以由工作人员/管理员购入新书籍/废弃部分物体等。

1.2 不同数据库间的区别

对于o/d/s/y这四种数据库类型,数据库和实例间的关系除了以上共同的部分外,还有着一些小区别:

  • oracle: 一个实例只能包含一个数据库;反过来,一个数据库可以同时被多个实例共享;一台主机上,可以同时提供多个服务实例,多个实例间以实例名来区分(也即不同的实例可以共享同一个端口);创建一个新数据库必须要先创建一个新的实例
  • db2: 一个实例可以同时包含多个数据库;一个数据库也可同时被多个实例所使用;一个节点(node, 主机)之上,可以同时运行多个实例,使用不同的端口来区分。对于db2而言,创建数据库(create database)属于实例级别的操作,一旦用户联接到一个数据库后(connect to)后就仅能进行数据库级别的操作,无法创建新的数据库。因此,db2中创建数据库的动作只能在连接到某个实例后进行(attach to)
  • sqlserver/sybase: 这俩一样,同一主机上可同时运行多个实例,使用不同实例名称/端口加以区分;一个实例可以包含多个数据库;但不同实例间不能共享同一数据库
1.4 数据库的基础组成部分

数据库大多使用以下对象来组织和管理数据:

  • 表(table) : 最基本的数据组织形式。表是拥有相同数据结构的一组数据的无序集合。表由行(row)和列(column)组成。列对应于一类特定的数据类型(及长度),可以被看作是数据结构中的一个字段(field);行是实现了表数据结构实现的一个数据对象,也是数据库中有完整意义的最小数据对象。对表的操作包括"create/alter/drop"等
  • 索引(inex) : 索引是基于表中的某一列或某几列作为关键字对表中的数据对象进行排序的结果。常用来加快数据查询速度和/或用来确保表中没有重复数据。对索引的操作包括"create/alter/drop"等
  • 视(view) : 视是一种虚拟表(virtual table)。视中不包含任何具体的数据,仅定义虚表中的数据结构。从某种角度说,视在一张/多张表中特定的字段之间建立逻辑联系,以表的形式提供给用户。视由"create/alter/drop"等语句生成/更改/丢弃,视中的数据结构由select语句决定。
  • 触发器(trigger) : 用来实现自动完成功能的控制逻辑。指定数据库在某个事件(如select/insert等操作)发生时自动执行指定的命令。
  • 存储过程(Stored Procedure) : 完成特定功能的一系列数据库操作命令的集合。数据库中一般都预置了一些系统存储过程,也可以由用户来创建。odsy中,存储过程的概念并不完全相同,有一些差异或各自的细分
  • 约束(constraint) : 表中数据对象必须符合的逻辑条件
  • 表空间(table space) : 容器对象,用来将指定的关联表/索引存放在同一块物理存储区域中(磁盘空间和内存空间),以加快查询速度
2. 用户(user)

用户,数据库的使用者,以字符串形式的用户名(user name)进行区分,使用密码(password)进行认证。一般情况下,为了方便操作,数据库内部还会为每一位用户创建一个数字标识(userid/uid/user#)。

数据库用户,相当于图书馆的读者和管理人员的集合。

o/d/s/y的差别:

  • oracle: 用户是用来连接和使用数据库的身份标识,每位用户可以拥有自己的权限与数据对象集合。拥有管理权限的管理员,可以使用"create user"语句创建新用户(并指定默认表空间),使用"grant"语句授予用户一定的权限(连接和指定操作)
  • db2: 使用操作系统级别的用户认证机制,用户首先是操作系统的用户,其次才是数据库的用户。因此db2中不能直接创建数据用户,必须通过先创建操作系统用户(组)后再使用"grant"语句向用户或用户所在组赋予数据库访问权限的方式进行
  • sqlserver: 数据库用户(dbuser)仅仅只针对数据库操作而言,不能用来登陆数据库/建立数据库连接。必须使用专用登录名(login name)来登录,登录完成后须映射为数据库用户才能拥有权限对数据对象进行操作。因此,登录名和(数据库)用户名之间存在的对应关系由数据库管理员来管理。同一登录名可映射为多个数据库上的不同用户。对sqlserver,创建一个完整用户的过程为:
    • 使用sp_addlogin(不推荐)或"create login"语句创建一个新的登录名(并指定默认数据库,语言等选项)
    • 使用sp_adduser(不推荐)或"create user"语句创建一个新的数据库用户(dbuser)(并指定对应的登录名,默认架构等)
    • 使用sp_addrolemember或"grant"语句为数据库用户(dbuser)分配访问权限
  • sybase:与sqlserver基本相同,不过仅能使用系统存储过程sp_addlogin/sp_droplogin来完成创建登录名的操作,数据库用户(dbuser)操作可通过系统存储过程sp_adduser/sp_dropuser或SQL语句"create user/drop user/alter user"完成

数据库的用户(dbuser/password),可以理解为使用图书馆服务的凭证。oracle/db2中的用户凭证,既可以用来进入图书馆(connect),也可以用来办理一定权限的操作。而sqlserver/sybase,额外需要一张门禁卡(loginname/password)才能进入图书大楼。

3. 角色(role)

角色,数据库安全模型中不同权限的集合,也可以拥有自己的数据对象。对于数据库用户来说,至为拥有系统角色之一(一般默认为pulic),也可以同时拥有多个角色。

几种数据库中,都有着一些预定的角色,用户还可以添加/删除自定义角色(create role, drop role),并赋予/取消他们不同的权限。(grant/revoke), 或者将一些具体的用户添加至角色当中(od中使用grant/revoke,s使用sp_addrolemember/sp_droprolemember完成, y以上两种方式均可)。

图书馆系统中,不同的人会有不同的身份,比如已登记的普通用户仅仅能借阅书籍(查询数据库),而图书管理人员不仅可以查阅书籍,还可进行购置/淘汰书籍等操作(添加/删除操作等)。像馆长等角色,还会拥有自己的办公室....

4. 架构(schema)

架构(schema, 也有翻译为模式),命名的逻辑容器对象, 用来存放表/视/存储过程/触发器等基本数据对象(仅为逻辑上的包含关系)。通常一个架构内所有数据对象都属于同一个用户(db user),也可以不属于任何用户。

对于表/视/存储过程等等基本数据对象,从逻辑从属关系上说,它们一定是属于某一个schema对象所有,也即属于某一个用户(dbuser)所有(对于不属于任何用户的schema,可以认为它们属于无主用户或公共用户);从物理存放关系上看,基本数据对象存放在某一个表空间(table space)之中。

最终,一个基本数据对象(object)的完整逻辑描述为server.database.schema.object。一次会话(session)中,用户对所有基本数据对象的操作总是基于会话的当前server/database/schema,如某一项未指定,则使用用户默认配置。

*对db2,server的准确名称应该是node;
**对oracle, server/database都已经由instance指定;
4.1 oracle/db2中的架构

对于ody,创建新用户时,隐式地也为此用户创建了一个同名schema,用以存放用户所拥有的数据对象。用户创建成功后,就不能修改自己的默认schema。用户访问自己同名schema以外其他架构中对象时,必须显式给出对象所在架构名称。不过,oracle和db2都提供了将当前会话架构由用户架构更改为其他架构的功能。

  • oracle : 可以通过"alter session set current_schema=xxx"将当前会话默认架构设定为xxx,会话用户访问xxx时无需再指定schema。甚至可以对某个用户的"logon"事件设定一个触发器,在用户登录后自动将会话默认架构设定为指定值。如下所示:
    CREATE OR REPLACE TRIGGER db_logon AFTER logon ON DATABASE WHEN (USER = 'username')
    BEGIN
    execute immediate 'ALTER SESSION SET CURRENT_SCHEMA = xxx';
    END;
  • db2 : 可通过"set [current] schema [=] xxx"的语句将当前会话架构切换为xxx
4.2 SQL Server中的架构

MS在SQL Server2000及以前版本中,以schema的处理方式和其他数据库相同,均是在创建用户时创建同名schema, 用户和schema隐式链接在一起;从sql server2005起,MS分离了schema与用户之间的隐式链接关系,不再一一对应。MS对此作法的好处描述如下(用户-架构分离)

  • 与早期版本相比,对架构及架构中包含的安全对象的权限的管理更加精细。有关详细信息,请参阅 GRANT 架构权限 (Transact-SQL) 和 GRANT 对象权限 (Transact-SQL)。
  • 架构的所有权和架构范围内的安全对象可以转移。有关详细信息,请参阅 ALTER AUTHORIZATION (Transact-SQL)。
  • 对象可以在架构之间移动。有关详细信息,请参阅 ALTER SCHEMA (Transact-SQL)。
  • 单个架构可以包含由多个数据库用户拥有的对象。
  • 多个数据库用户可以共享单个默认架构。
  • 架构可以由任何数据库主体拥有。这包括角色和应用程序角色。
  • 可以删除数据库用户而不删除相应架构中的对象。

简单地说,解除了用户和架构一对一的链接,分离schema和db user之后,可以更灵活地单独处理用户或架构,数据共享也更加便利。

SQL Server中架构的一些其他特点:

①从sql server 2005后,创建新用户(create user)时可以使用参数“WITH DEFAULT_SCHEMA = schema_name”显式为用户指定一个架构名称,若未指定,则缺省为"dbo";MS不推使用sp_adduser,仅为保持向下兼容而提供,使用sp_adduser创建的用户,拥有一个与用户名相同的同名架构。

②sql server 2000中的系统表syslogins, sysusers被替换sys.database_principals,sys.schemas,sys.server_principals 视图(前两张表仍可访问,但不推荐使用)。

③sql2005起,用户查询(select)数据对象时,如未显示指定架构,sql server会首先在用户默认架构中查中,如未找到,系统会自动在dbo架构中进行查找。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值