架构 (数据库)
此条目可参照英语维基百科相应条目来扩充。 |
架构(英语:Schema,又称模式),台湾翻译为纲要,在数据库系统中是形式语言描述的一种结构,是对象的集合,[1]可包含各种对象如:表、字段、关系模型、视图、索引、包、存储过程、子程序、队列、触发器、数据类型、序列、物化视图、同义词(synonym)、database link、directory、XML schema等。[2][3]
模式的益处:
- 允许多个用户使用一个数据库而不会干扰其它用户。
- 把数据库对象组织成逻辑组,让它们更便于管理。
- 第三方的应用可以放在不同的模式中,不会和其它对象的名字冲突。
Oracle数据库实现
在Oracle数据库中,schema object是一类逻辑数据库存储结构。[4]
Oracle的数据库会为每个在数据库的用户关联一个独立的schema。[5]
schema包括有一堆schema objects的集合。schema objects的例子包括有:
与此同时,非schema objects可能包括[6]:
- users
- roles
- contexts
- directory objects
Schema objects跟磁盘上用来储存资料的物理档案并没有一对一的关连。不过,Oracle数据库会将schema objects以虚拟的逻辑形式储存在数据库的表空间里。每一件schema object的数据在物理上如同其他表空间的内容一样,储存在表空间所属的其中一个datafile里。部分objects(例如:表、索引、丛集等)所占的空间,数据库管理员可控制Oracle的RDBMS可如何在表空间的datafile内如何分配与schema object。
schemas与表空间之间没有必然的关系:表空间可以包含来自不同schema的objects,并且单个schema的object可以位于不同的表空间中。
SQL Server数据库实现
SQL Server数据库把schema译作“架构”。架构是数据库中对象的容器。架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。默认架构DBO。访问默认架构中的对象时,不需要指定架构的名称。微软建议使用两段式对象名称:
架構名.對象名
创建架构的语句举例:
CREATE SCHEMA mySchema AUTHORIZATION user1 CREATE TABLE myTable1(source int, cost int, partnumber int) GRANT SELECT TO user2 Deny SELECT TO AnotherUser3;
上述语句创建一个架构mySchema,所有者为user1,包含表myTable1,授予user2以SELECT权限,拒绝给AnotherUser3以SELECT权限。
授予/撤销用户对架构的所有权:
GRANT INSERT ON SCHEMA ::mySchema1 To myUser2; REVOKE INSERT ON SCHEMA ::mySchema1 To myUser2;
把对象从一个架构移动到另一个架构(必须同个数据库):
ALTER SCHEMA mySchema2 TRANSFER mySchema1.myTable1;
删除一个架构,该架构不能包含对象:
DROP SCHEMA mySchema3;
历史
在 SQL Server 2000 中,数据库用户和架构是隐式同一。每个数据库用户都是与该用户同名的架构的所有者。对象的所有者在功能上与包含它的架构所有者相同。因而,SQL Server 2000 中的完全限定名称的“架构”也是数据库中的用户。
SQL Server 2005 中,架构独立于创建它们的数据库用户而存在。多个用户可以共享一个默认架构进行统一的名称解析。 删除数据库用户不需要重命名该用户架构所包含的对象。完全限定的对象名称现在包含四部分:server.database.schema.object。如果未定义DEFAULT_SCHEMA 选项设置和更改默认架构,则数据库用户将把 dbo 作为其默认架构。
MySQL数据库实现
CREATE SCHEMA是CREATE DATABASE的同义词。
PostgreSQL数据库实现
PostgreSQL数据库集群可以有一个或多个命名的数据库。用户和用户组在整个集群的范围内是共享的,即不能有同名用户。任何给定的客户连接(connection)都只能访问一个数据库。
一个数据库包含一个或多个命名的模式, 模式包含其它命名的对象,如表、数据类型、函数、操作符等。在不同的模式里使用同名的对象不会导致冲突。例如,schema1 和 schemaA 都可以包含叫做 mytable 的表。一个用户可以访问所连接的数据库中的任意模式中的对象,只要有这个权限。
Apache Derby数据库实现
Apache Derby数据库(即Java DB)的任何connection的当前schema,默认是对应于该用户名的一个schema。如果无用户名被提供,那么当前用户名与当前schema缺省是APP。
但即使当前schema被设置为用户名,这个schema仍然可能不存在。一个schema只能被创建:通过CREATE SCHEMA语句显式创建或者创建一个对象(例如表等)来隐式创建。
APP schema总是存在,不需要创建。
如果你的程序试图访问当前schema但该schema下没有创建任何对象,就会遇到“schema not exists”错误。[8]
SQL实现
ISO/IEC 9075-1 SQL标准中将schema定义为描述符的持久命名集合(a persistent, named collection of descriptors)。
创建一个schema:
create schema demo_schema;
在指定模式里创建表:
CREATE TABLE myschema.mytable ( ... );
删除一个空的schema:
drop schema myschema;
删除一个模式以及模式里面所有的对象:
drop schema MySchema CASCADE;
默认的pulic schema:创建表时,如果没有指定schema,则会自动被归属到数据库的“public”的模式中。下面两种创建表的方式是等效的:
CREATE TABLE tableName(...); CREATE TABLE public.tableName(...);
模式的权限
用户默认是看不到模式中不属于他们所有的对象。
模式权限:
- USAGE 权限
- CREATE 权限:在别人的模式里创建对象。缺省时,每个用户在 public 模式上有 CREATE 权限。撤销这个权限:REVOKE CREATE ON public FROM PUBLIC; (第一个 "public" 是模式,第二个 "public" 意思是"所有用户"。 第一句里它是个标识符,而第二句里是个关键字,所以有不同的大小写)
模式搜索路径
系统使用一个模式的列表作为搜索路径来解析一个表属于哪个模式。搜索路径中的第一个模式是当前模式;CREATE TABLE 没有声明模式名的时候,新建的表属于当前模式。
查看搜索路径:
SHOW search_path; 'PostgreSQL数据库
设置搜索路径
SET search_path TO myschema,public; 'PostgreSQL数据库
参考文献
- ^ Pottinger, P.; Berstein, P. Schema merging and mapping creation for relational sources. New York, NY: ACM. 2008: 73–84. CiteSeerX 10.1.1.405.2990 . ISBN 9781595939265. doi:10.1145/1353343.1353357.
|journal=
被忽略 (帮助) - ^ Rybinski, H. On First-Order-Logic Databases. ACM Transactions on Database Systems. 1987, 12 (3): 325–349. doi:10.1145/27629.27630.
- ^ Imielinski, T.; Lipski, W. A systematic approach to relational database theory. New York, NY: ACM. 1982: 8–14. ISBN 978-0897910736. doi:10.1145/582353.582356.
|journal=
被忽略 (帮助) - ^ Ashdown, Lance; Kyte, Tom. Oracle Database Concepts 11g Release 2 (11.2). et al. Oracle Corporation. 2010-02 [2010-04-14]. (原始内容存档于2010-01-29).
A database schema is a logical container for data structures, called schema objects. Examples of schema objects are tables and indexes.
- ^ Oracle Database Concepts 10g Release 2 (10.2)Part Number B14220-02. [2012-11-26]. (原始内容存档于2019-05-07).
A schema is a collection of logical structures of data, or schema objects. A schema is owned by a database user and has the same name as that user. Each user owns a single schema. Schema objects can be created and manipulated with SQL.(schema是数据或模式对象的逻辑结构的集合,由数据库用户拥有,并且与该用户具有相同的名称,也就是说每个用户拥有一个独立的schema。)
- ^ Ashdown, Lance; Kyte, Tom. Oracle Database Concepts 11g Release 2 (11.2). et al. Oracle Corporation. February 2010 [2010-04-14]. (原始内容存档于2010-01-29).
Other types of objects are also stored in the database and can be created and manipulated with SQL statements but are not contained in a schema. These objects include database users, roles, contexts, and directory objects.
- ^ 《MySQL 5.7 Reference Manual》,“MySQL Glossary”: In MySQL, physically, aschema is synonymous with adatabase. You can substitute the keywordSCHEMA instead ofDATABASE in MySQL SQL syntax, for example using CREATE SCHEMA instead of CREATE DATABASE.. [2018-08-03]. (原始内容存档于2021-04-13).
- ^ [[Apache Derby]]数据库(即[[Java DB]]) Frequently Asked Questions 5.3. Why do I get the error 'schema does not exist'?. [2018-08-03]. (原始内容存档于2020-08-25).