在数据库中,schema、catalog分别指的是什么? 最后更新时间:2023年12月18日 #### 参考资料 - https://www.zhihu.com/question/20355738 - https://stackoverflow.com/questions/11618277/difference-between-schema-database-in-mysql - [数据库-----catalog与schema简介](https://blog.csdn.net/hekewangzi/article/details/41390155) #### Charles的回答 数据库系统中的Catalog与Schema是方便管理数据库对象的一种抽象概念,与开发中的workspace与package概念相似,主要解决数据库对象访问的命名冲突问题。在一个数据库系统中,可能包含多个Catalog,每个Catalog包含多个Schema,每个Schema下面又包含多个数据库对象,反过来说,每个数据库的对象必然属于一个Schema,而该Schema必然属于一个Catelog。当然,各个数据库系统对Catalog与Schema的定义和实现方式各不相同,下面就以TDengine来说一下其中的Catalog与Schema是如何划分和使用的。 TDengine 是一款开源、高性能、云原生的时序数据库(Time Series Database),且针对物联网、车联网、工业互联网、金融、IT 运维等场景进行了优化。TDengine 的代码,包括集群功能,都在 GNU AGPL v3.0 下开源。除核心的时序数据库功能外,TDengine 还提供缓存、数据订阅、流式计算等其它功能以降低系统复杂度及研发和运维成本。可参考TDengine官网了解详细信息 https://www.taosdata.com/ 在TDengine中,Catalog是通过database名来管理的,不同的Catalog创建不同的database。Catalog有自己的属性,在TDengine中,每一个database有属于自己的元数据,可以通过SQL语句对元数据进行查看和修改。 Schema是Catalog下对数据的进一步抽象,数据库中可以存在多个应用的数据表,这些不同应用的表可以放在不同的Schema中,这样就可以根据应用把数据表分开进行管理。在TDengine中,超级表(super table)是Schema的一种实现,超级表不能直接写入和存储数据,而是需要建立相应的子表进行数据的写入和存储。每一个database下可以创建不同的超级表,超级表是子表的一种模版定义,通过将不同子表中相同的列定义为标签(tag),一方面实现了子表数据中数据的差异化,另一方面大大节省了数据存储的空间。所以,在TDengine中,Catalog与Schema分别对应database和super table。 在TDengine中,创建数据库很简单,如: create database if not exists db vgroups 10 buffer 10; 以上语句创建了一个有10个vgroup名为‘db’的数据库,其中每个vnode分配了10MB的写入缓存,这就相当于创建了一个Catelog目录。 vgroup是不同数据节点上vnode的一个虚拟节点组,采用RAFT一致性协议保证系统的高可用和高可靠;buffer是指一个vnode写入内存池的大小,单位为MB,默认值为96。 TDengine的database还有很多元数据属性,如数据库文件存储数据的时间跨度、数据库文件的压缩标志位等,所有的属性可通过SQL语句进行管理。如想了解database的更多参数及技术细节,可访问https://github.com/taosdata 使用创建的database,如 use db; 在database下创建super table和database一样简单,如: create stable if not exists iot(ts timestamp, voltage float) tags(location nchar(20)); 以上语句创建一个名为iot的超级表,在TDengine中,表的第一个字段必须是TIMESTAMP类型,同时根据一个数据采集点一张表的策略,tag中的location表示不同数据采集点的数据,通过对标签的定义,可以使一类采集点的数据拥有不同维度的静态标签属性,实现数据差异化,同时被超级表统一管理。 按照Catalog与Schema结构定义,可以通过http://Catalog.Schema.xxx的方式访问限定的数据库对象,在TDengine中,可以通过database.supertable的方式对超级表进行访问,如: select ts, voltage, location from db.iot 对子表数据的访问可以使用tbname关键字,如 select ts, voltage,location from db.iot wehre tbname='xxx' 使用超级表对子表的抽象,是根据时序数据采集特点,不同数据采集点产生数据的过程完全独立,每个数据采集点的数据源是唯一的,一张子表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。同时对于一个数据采集点而言,其产生的数据是按照时间排序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。 TDengine使用database和super table对数据的存储和访问实现了二级抽象,通过‘.’运算符和tbname关键字实现对不同层级下的数据对象进行访问。 所有元数据及数据对象都是通过SQL语言进行访问,极大地简化了操作和学习成本。 数据对象的权限控制精确到table,可以通过对database或(super)table赋予用户不同的权限,来限定用户对数据的访问权限。 关于 TDengine 的更多技术细节,点击文档链接可查阅:https://docs.taosdata.com #### Epimoni的回答 在关系型数据库中,分三级:`database.schema.table`。即一个数据库下面可以包含多个schema,一个schema下可以包含多个数据库对象,比如表、存储过程、触发器等。但并非所有数据库都实现了schema这一层,比如mysql直接把schema和database等效了,PostgreSQL、Oracle、SQL server等的schema也含义不太相同。 所以说,关系型数据库中没有catalog的概念。但在一些其它地方(特别是大数据领域的一些组件)有catalog的概念,也是用来做层级划分的,一般是这样的层级关系:catalog.database.table。 #### 夏天的回答 对于mysql,schema和database可以理解为等价的. ``` As defined in the MySQL Glossary: In MySQL, physically, a schema is synonymous with a database. You can substitute the keyword SCHEMA instead of DATABASE in MySQL SQL syntax, for example using CREATE SCHEMA instead of CREATE DATABASE. Some other database products draw a distinction. For example, in the Oracle Database product, a schema represents only a part of a database: the tables and other objects owned by a single user. ``` [Difference Between Schema / Database in MySQL](https://stackoverflow.com/questions/11618277/difference-between-schema-database-in-mysql)
Comments | NOTHING