来自 Silberschatz 等人的数据库系统概念:
\n\n\n4.5.7 模式、目录和环境
\n与早期的 \xef\xac\x81le 系统一样,早期的数据库系统也为所有关系提供一个名称空间。用户必须协调以确保他们不会尝试对不同的关系使用相同的名称。现代数据库系统为命名关系提供了三级层次结构。层次结构的顶层由目录组成,每个目录都可以包含架构。SQL 对象(例如关系和视图)包含\n在架构内。(某些数据库实现使用术语\n \xe2\x80\x9cdatabase"代替术语目录。)
\n为了对数据库执行任何操作,用户(或程序)\n必须\xef\xac\x81首先连接到数据库。用户必须提供用户名\n并且通常还需要提供密码以验证用户的身份。每个用户都有一个默认的目录和架构,并且该组合对于该用户来说是唯一的。当用户连接到数据库系统时,将为该连接设置默认\n目录和架构;这对应于当用户登录操作系统时\n当前目录被设置为用户\xe2\x80\x99 的主目录。
\n为了唯一地标识关系,可以使用由三部分组成的名称,例如\ncatalog5.univ schema.course 我们可以省略\n目录组件,在这种情况下,名称的目录部分被视为\n默认目录用于连接。因此,如果catalog5是默认目录,我们可以使用univ schema.course来唯一地标识相同的关系。
\n
谢谢。
\n你的第一句话毫无意义。
\n\n像 \xe2\x80\x9cperson\xe2\x80\x9d 这样的表/关系具有像 \xe2\x80\x9cname\xe2\x80\x9d、\xe2\x80\x9cphone\xe2\x80\x9d 和 \ 这样的属性/列xe2\x80\x9cemail\xe2\x80\x9d。
\n\n表在称为模式的名称空间中分组在一起。因此,诸如 \xe2\x80\x9cwarehouse\xe2\x80\x9d 之类的模式可以有一个名为 \xe2\x80\x9cperson\xe2\x80\x9d 的表,而另一个模式如 \xe2\x80\x9csales\xe2\x80\ x9d 还可以有一个名为 \xe2\x80\x9cperson\xe2\x80\x9d 的表。每个目录都有一个或多个模式,每个模式都带有一个名称,例如此处所示的 \xe2\x80\x9cwarehouse\xe2\x80\x9d 和 \xe2\x80\x9csales\xe2\x80\x9d 。
\n\n除了作为命名空间之外,模式通常还充当安全边界。据我所知,这是一个实现细节,SQL 标准并不要求。
\n\n\xe2\x80\x9cschema\xe2\x80\x9d 一词也通常以不同的、更随意和通用的方式使用,来描述为满足应用程序的需求而做出的表和列设计选择。请参阅下面 IMSoP 的第一条评论。非正式意义上的模式可能涉及正式 SQL 标准意义上的任意数量的目录、模式、表和列。
\n\n至于#2,你的引文解释了这一点。\xe2\x80\x9cCatalog\xe2\x80\x9d 和 \xe2\x80\x9cdatabase\xe2\x80\x9d 是同义词。SQL 标准正式使用单词 \xe2\x80\x9ccatalog\xe2\x80\x9d。
\n\n对于#3,努力实现 SQL 标准的高级数据库通常支持标准定义的所有级别:集群 > 目录 > 架构 > 表。这包括 Postgres 和 Microsoft SQL Server。
\n\nH2 数据库引擎支持单独的数据库,每个数据库都是具有架构的目录,但没有将目录/数据库分组在一起的集群。
\n\n从我对 MySQL 文档的有限搜索中可以看出,MySQL 的局限性更大,并且不支持完整的层次结构。
\n\n有关详细信息,请参阅此相关问题:关系数据库中的目录和架构有何区别?
\n