数据库模式(Schema)是数据库的组织和结构,但不同数据库系统对其定义不同
AIAI Summary (BLUF)
数据库模式(Schema)是数据库的组织和结构,但不同数据库系统对其定义不同。MySQL中Schema与数据库同义,Oracle中Schema由用户拥有,SQL Server中则是独立实体。创建Schema的方式也各异,需要根据具体DBMS理解与操作。
核心洞察
这篇文章最让我意外的是 Oracle 的操作。直觉上 CREATE SCHEMAA structured data markup vocabulary used to help search engines understand and display webpage content. 自然是要创建一个 schema,Oracle 偏不,用户建好时 schema 就已经存在了。从 MySQL 切到 Oracle 的人很容易被这个差异绊一下,网上泛泛的说法很多,不如直接看官方文档。
核心结论
在 Oracle 中,
CREATE SCHEMA并不会创建 schema——用户一经建立,schema 就已存在;该语句实际用于在一个事务中关联表、视图和权限。在 MySQL 中,
SCHEMA与DATABASE是官方定义上的同义词,CREATE SCHEMA就等同于CREATE DATABASE。在 SQL Server 中,schema 是数据库内部一个独立命名的实体,
CREATE SCHEMA会真正创建一个 schema 对象,既不等同于建库,也不只是辅助语句。三大数据库对 schema 的定义并不一致:MySQL 视其为 database按照数据结构来组织、存储和管理数据的仓库。在某些DBMS中与Schema同义。 的同义词,Oracle 将其归为数据库用户所有且每个用户仅有一个 schema,SQL Server 则将 schema 视为数据库内的独立实体。
国际标准 ISO/IEC 9075-1 将 schema 定义为“描述符的持久命名集合”,与三大商业数据库的具体实现存在差异。
模式是什么
数据库里 schema 这个词,念作 skee-muh 或 skee-mah,中文叫模式。它描述的是数据库的组织方式和数据结构。表、列、数据类型、视图、存储过程、主键、外键、表之间的关系,这些都在 schema 的范围内。
模式图是最好的理解方式。上面那张是简单例子,三个表,主键、外键标得清清楚楚,表之间的连线一眼就能看懂。下面那张复杂不少,整个图分成四个区域。Customer Data 那块管客户信息,姓名地址这类。Business 是业务数据,员工、商店位置、付款细节。Inventory 是库存,这里的产品是电影,所以包含片名、类别、演员。Views 是预定义的查询视角,用来跑评估类报表。
这些图不只是画出来好看的。MySQL Workbench 能直接从图里生成 CREATE TABLE数据库中存储数据的二维结构,由行和列组成。 脚本,拿这个脚本就能建库。反过来,也能把已有数据库转成关系图。
Schema 和 Database 是否等同
这俩是不是一回事,完全取决于你用的是哪个数据库。
MySQL 的官方文档说得直白,物理上 schema 和 database 就是同义词。在 MySQL 的 SQL 语法里,SCHEMA 关键字可以直接替换 DATABASE,写 CREATE SCHEMA 就相当于 CREATE DATABASE。
Oracle 就反过来。Oracle 文档里说,某些对象能存在数据库里,但进不了 schema。模式和数据库不能画等号。
SQL Server 的说法跟 Oracle 类似,schema 是数据库内部一个独立的实体,也不能跟数据库混为一谈。
同一个词,三大数据库各给各的定义。刚开始接触数据库的人,被绕晕太正常了。
那 SQL 标准怎么定义?ISO/IEC 9075-1 把 schema 定义为描述符的持久命名集合。这个定义偏抽象,能看懂大概是在说一组持久化的描述结构就够了。
还有个渊源可以聊。schema 这个词来自希腊语 skhēma,原本的意思是形状、轮廓、方案。心理学里也用它,指的是人脑组织信息的模式。设计数据库之前,先分析数据之间有啥关系,这一步其实就是概念层面的 schema 设计。软件开发里讨论 schema 时还会分成概念模式、逻辑模式、物理模式、外部模式、内部模式,各有各的所指。
DBMS 的 schema 定义
MySQL 官方手册对 schema 的解释比较完整:一组互相关联的数据库对象,包括表、列、列的数据类型、索引、外键等。这些对象靠 SQL 语法连在一起,列组成表,外键引用表和列。逻辑上也应作为一个应用或框架的组成部分协同工作。MySQL 自带的 INFORMATION_SCHEMA 和 performance_schema 数据库,名字里的 schema 强调的就是表和列之间的紧密关系。
SQL Server 的技术文档干脆得多,schema 就是数据库里表、字段、数据类型、主键和外键的名称集合。
Oracle 的玩法完全不一样。官方文档说,schema 是数据的逻辑结构集合,归数据库用户所有,名字跟用户名相同。每个用户只拥有一个 schema。也就是说,在 Oracle 里建了用户,schema 就自动存在了,它不是一个能独立创建的东西。原文参考资料里给出了 MySQL 5.7 手册、SQL Server 2016 文档、Oracle 12c 文档的官方链接,感兴趣可以顺着去翻。
创建 Schema
三个数据库都支持 CREATE SCHEMA 语句,可执行起来的含义各走各路。
MySQL 里 CREATE SCHEMA 就是创建数据库。它就是 CREATE DATABASE 的同义词,两条语句随便用哪个都行。
Oracle 里 CREATE SCHEMA 实际不创建 schema。因为前面说了,用户一建,schema 就有了。这条语句真正的作用是在一条事务里把表、视图和权限一次性关联起来,省得分别发多条 SQL。
SQL Server 又不一样。CREATE SCHEMA 会真的创建一个独立命名的 schema 对象,创建之后可以往里加用户和对象。它不像 MySQL 那样等同于建库,也不像 Oracle 那样只是个辅助语句。
换个环境要重新查证
schema 这词在不同数据库里含义差得挺远。用哪个系统,就按哪个系统的规则理解。换到新环境,别急着建表,先把官方文档里对 schema 的定义翻清楚。
常见问题(FAQ)
数据库Schema和Database有什么区别?
两者关系因数据库而异。MySQL中Schema与Database同义;Oracle中Schema归用户所有,与Database不同;SQL Server中Schema是数据库内的独立实体。需按具体DBMS理解。
在Oracle中执行CREATE SCHEMA语句会怎样?
Oracle中用户创建时Schema已存在,CREATE SCHEMA不实际创建Schema,而是用于在单个事务内关联表、视图和权限,避免发送多条SQL,其行为与MySQL和SQL Server不同。
SQL Server中的Schema和MySQL中的一样吗?
不一样。SQL Server的Schema是数据库内独立命名的对象,可通过CREATE SCHEMA创建,并向其添加用户和对象。而MySQL中Schema与Database等同,Oracle中则自动存在且不单独创建。
版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。
文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容可能基于公开资料整理,亦可能使用 AI 辅助生成或润色;我们尽力确保准确与合规,但不保证完整性、时效性与适用性,请读者自行甄别并以官方信息为准。
若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。



