一个schema、一张table和一个database有什么区别?

224

这可能是一个新手(或更糟)的问题。但我一直把模式视为数据库中的表定义。这是错误的,或者不完全正确。我已经忘记了我在数据库课程中学到的很多内容。


6
在 Oracle 中,"schema" 只是指一个用户。也就是说,当我们创建一个用户时,会同时创建一个对应的 schema,然后我们可以添加表、视图、索引、包等内容。 - smali
18个回答

308

schema -> 楼层平面图

database -> 房子

table -> 房间


142
有点神秘,但不是错误的;但你真的认为一个自称新手的人会理解吗? - Stein G. Strindhaug
12
好的比喻。我会把“floor plan”改为“蓝图(blue prints)”,因为模式(schema)不仅仅包括桌子,而且蓝图包含了电线、加热和管道。 - Paul Tomblin
8
“Schema”其实就是“计划”的意思。我见过它被用来指代整个数据库,或者只是一个表或视图。 - MusiGenesis
1
肯定的,模式是在数据库中的,所以顺序是错误的吗?我特别指的是Oracle,但一个数据库包含许多模式。 - Robert
4
我倾向于将Oracle中的模式视为用户。因此,即使在不同的数据库中,定义也会有所不同:D 真是令人烦恼。 - Robert
显示剩余11条评论

162

关系模式是表的逻辑定义,它定义了表的名称、每个列的名称和类型。它类似于一个计划或蓝图。数据库模式是整个数据库的关系模式集合。

表是一种具有一堆行(也称为 "元组")的结构,每个行都有由模式定义的属性。表还可能在其上拥有索引,以帮助查找特定列上的值。

数据库在正式上是任何数据的集合。在这个上下文中,数据库将是表的集合。数据库管理系统(DBMS)是管理和运行数据库的软件(如MySQL, SQL Server, Oracle等)。


2
数据库模式还包括索引、视图等。 - Paul Tomblin
1
这肯定是不正确的。数据库并不仅仅是一组表格。例如,您可以拥有30个数据库而没有一个表格。 - Robert
5
没有任何数据表的数据库有什么意义? - Paul Tomblin
29
即使你没有任何数据表,那仍然是一组数据表 - 它是一个空的数据表集合。 - Jon Skeet
1
我想不出有什么理由可以改变数据库的定义,只是因为有/没有表存在。我同意,我期望在数据库中找到表 :) - Robert
显示剩余6条评论

26

简而言之,模式是整个数据库的定义,因此它包括表、视图、存储过程、索引、主键和外键等内容。


17

Schema 的行为类似于面向对象编程中的父对象,因此它本身不是数据库。也许 这个链接 会有用。

但是,在 MySQL 中,这两者是等效的。关键词 DATABASE 或 DATABASES 可以在出现的任何地方替换为 SCHEMA 或 SCHEMAS。例如:

  • CREATE DATABASE <=> CREATE SCHEMA
  • SHOW DATABASES <=> SHOW SCHEMAS

MySQL 文档

SCHEMA 和 DATABASE 术语是与 DBMS 有关的。

表格(Table) 是使用垂直列模型(由名称标识)和水平行组织的数据元素(值)集合。一个数据库包含一个或多个(通常是)表格,您可以将数据存储在这些表格中。这些表格可能彼此相关(看这里)。


有价值的答案 - sofs1

15

这篇文章只与Oracle相关,而在另一个DB的上下文中,Schema的定义也会发生改变。

可能这是一种可以通过谷歌解决的问题,但是需要注意的是术语的定义似乎存在差异,这是最令人烦恼的事情 :)

在Oracle中,一个数据库就是一个数据库。在您的脑海中,可以将其视为数据文件、重做日志和实际存在于磁盘上的数据库本身(即不是实例)

Schema实际上是一个用户,更具体地说,它是由一个用户拥有的一组表/存储过程/索引等等。另一个用户具有不同的模式(他/她拥有的表),但是用户还可以查看他们具有选择权限的任何模式。因此,一个数据库可以包含数百个模式,每个模式包含数百个表。您可以在同一数据库中的不同模式中拥有相同名称的表。

表就是表,一个包含数据行和列的集合,位于模式中。

在SQL Server中,定义可能会有所不同。我不了解这点。


10

enter image description here

根据https://www.informit.com/articles/article.aspx?p=30669,所有对象的名称必须在某个范围内唯一。每个数据库必须有一个唯一的名称;模式的名称必须在单个数据库的范围内是唯一的;表的名称必须在单个模式的范围内是唯一的;列名必须在表内是唯一的。索引的名称必须在数据库内是唯一的。

9
根据PostgreSQL文档所述,一个数据库包含一个或多个命名模式(schemas),这些模式又包含表格。 模式还包括其他类型的命名对象,包括数据类型、函数和运算符。同一对象名称可以在不同的模式中使用而不冲突;例如,schema1myschema都可以包含名为mytable的表格。与数据库不同,模式并没有被严格分离:如果用户有权限,他可以访问连接到的数据库中任何一个模式中的对象。
有几个原因可以使用模式:
  • 允许多个用户在不干扰彼此的情况下使用一个数据库。
  • 将数据库对象组织成逻辑组,使它们更易于管理。
  • 第三方应用程序可以放置在单独的模式中,以避免与其他对象名称冲突。
模式类似于操作系统级别的目录,但不能嵌套。

7
与上面的一些答案相反,以下是我基于使用每个技术的经验所得出的理解:
  • MySQL: database/schema :: table
  • SQL Server: database :: (schema/namespace::) table
  • Oracle: database/schema/user :: (tablespace ::) table
请纠正我在Oracle中是否可选tablespace,因为很长时间以来我都没有使用过它们。

1
这个很不错!谢谢。只是缺少了PostgreSQL :) - KhaimovMR

3

正如MusiGenesis所说,在大多数数据库中:

模式:数据库:表 :: 楼层平面图:房子:房间

但是,在Oracle中,可以更容易地理解为:

模式:数据库:表 :: 所有者:房子:房间


3

Schema 是一组数据库对象,其中包括逻辑结构。 它具有拥有者的名称。 一个 database 可以有任意数量的 Schema。 来自数据库的一个表可以出现在同名的两个不同 Schema 中。 用户可以查看他们被分配了选择权限的任何 Schema。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接