MySQL的Schema是什么?

本文已收錄在Github關(guān)注我,緊跟本系列專(zhuān)欄文章,咱們下篇再續(xù)!

  • ?? 魔都架構(gòu)師 | 全網(wǎng)30W技術(shù)追隨者
  • ?? 大廠分布式系統(tǒng)/數(shù)據(jù)中臺(tái)實(shí)戰(zhàn)專(zhuān)家
  • ?? 主導(dǎo)交易系統(tǒng)百萬(wàn)級(jí)流量調(diào)優(yōu) & 車(chē)聯(lián)網(wǎng)平臺(tái)架構(gòu)
  • ?? AIGC應(yīng)用開(kāi)發(fā)先行者 | 區(qū)塊鏈落地實(shí)踐者
  • ?? 以技術(shù)驅(qū)動(dòng)創(chuàng)新,我們的征途是改變世界!
  • ?? 實(shí)戰(zhàn)干貨:編程嚴(yán)選網(wǎng)

1 Schema概念

schema在數(shù)據(jù)庫(kù)領(lǐng)域,表示數(shù)據(jù)庫(kù)對(duì)象的集合,包含各種對(duì)象如:表、視圖、存儲(chǔ)過(guò)程和索引等。

SQL 標(biāo)準(zhǔn)

一個(gè)數(shù)據(jù)庫(kù)(Database)可包含多個(gè)模式(Schema),模式是數(shù)據(jù)庫(kù)對(duì)象的邏輯容器。

Oracle

Schema 與用戶(User)強(qiáng)綁定。創(chuàng)建用戶時(shí)就等于創(chuàng)建了一個(gè)同名 Schema。用戶(user)就是 schema 的擁有者,用戶名稱(chēng)與 schema 名通常一致。一般一個(gè)用戶對(duì)應(yīng)一個(gè)集合,為了區(qū)分,需給不同集合起名。其實(shí)一個(gè)用戶/角色可擁有多個(gè) schema,多個(gè)用戶也可以訪問(wèn)同一個(gè) schema(通過(guò)權(quán)限授權(quán))。

用戶的schema名相當(dāng)于用戶名,并作為該用戶的缺省schema。所以schema集合看上去像用戶名。如訪問(wèn)一個(gè)數(shù)據(jù)表時(shí),若該表未指明屬于哪個(gè)schema,系統(tǒng)會(huì)自動(dòng)加上默認(rèn)schema:

PostgreSQL

schem是數(shù)據(jù)庫(kù)內(nèi)的命名空間,可由任一角色擁有;數(shù)據(jù)庫(kù)中常見(jiàn)的 public schema 與角色不一一對(duì)應(yīng),角色可以擁有多個(gè) schema,schema 名不等于用戶名。解析未限定對(duì)象時(shí)依賴(lài) search_path(搜索路徑)。

SQL Server

自 SQL Server 2005 起,schema 與數(shù)據(jù)庫(kù)用戶分離(schema 是命名空間,用戶可有默認(rèn) schema,如 dbo)。所以 username ≠ schema name(盡管歷史上兩者關(guān)系緊密)。用戶可以有默認(rèn) Schema,但 Schema 本身是獨(dú)立對(duì)象。

MySQL

databaseschema 視作同義詞(CREATE SCHEMA = CREATE DATABASE);MySQL 沒(méi)有像 PostgreSQL 那樣的 schema 命名空間概念。

2 Schema的創(chuàng)建

在不同數(shù)據(jù)庫(kù)中要?jiǎng)?chuàng)建的Schema方法不一,但共同點(diǎn)是都支持CREATE SCHEMA語(yǔ)句。MySQL中可通過(guò)CREATE SCHEMA創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

不同 DBMS 的 CREATE SCHEMA 語(yǔ)義和可用選項(xiàng)不同,如:

  • PostgreSQL 支持 CREATE SCHEMA name AUTHORIZATION owner
  • Oracle 的 CREATE SCHEMA 語(yǔ)法存在但不常用于創(chuàng)建用戶,通常用 CREATE USER 來(lái)建立 schema 所屬的用戶)

Oracle / PostgreSQL / MySQL / SQL Server 在 schema 概念、默認(rèn)行為和常用語(yǔ)法上的差異:

  • PostgreSQL
CREATE SCHEMA myschema AUTHORIZATION myrole;
SET search_path TO myschema, public;
-- unqualified object -> 按 search_path 解析
  • SQL Server
CREATE SCHEMA Sales AUTHORIZATION dbo;
ALTER USER alice WITH DEFAULT_SCHEMA = Sales;
-- 未限定的表名先在 alice 的默認(rèn) schema 中查找,再到 dbo 等
  • MySQL
CREATE DATABASE mydb;   -- 或 CREATE SCHEMA mydb;
USE mydb;
CREATE TABLE t1 (...);
  • Oracle(常見(jiàn)用法)
CREATE USER scott IDENTIFIED BY tiger;
GRANT CONNECT, RESOURCE TO scott;
-- scott 有自己的 schema(對(duì)象以 scott. 開(kāi)頭)

3 默認(rèn)解析規(guī)則

不同數(shù)據(jù)庫(kù)在你未顯式指定 Schema 時(shí),解析對(duì)象名的方式不同:

PostgreSQL

使用 search_path 參數(shù)決定解析順序:

SET search_path TO myschema, public;
SELECT * FROM mytable;  -- 優(yōu)先在 myschema 中查找

默認(rèn)包含 "$user", public,即先嘗試與當(dāng)前用戶名同名的 Schema,再找 public

SQL Server

用戶有一個(gè) 默認(rèn) Schema

ALTER USER alice WITH DEFAULT_SCHEMA = Sales;
SELECT * FROM Orders;   -- 會(huì)先到 Sales.Orders 查找

如果對(duì)象在默認(rèn) Schema 不存在,會(huì)嘗試 dbo。

MySQL

使用 USE dbname 設(shè)置當(dāng)前數(shù)據(jù)庫(kù):

USE mydb;
SELECT * FROM mytable;  -- 實(shí)際為 mydb.mytable

沒(méi)有獨(dú)立的 Schema 概念。

Oracle

登錄用戶的名字就是 Schema:

CONNECT scott/tiger;
SELECT * FROM emp;  -- 實(shí)際為 scott.emp

若要訪問(wèn)其他用戶對(duì)象,需要顯式加前綴(如 hr.employees)并具備權(quán)限。

4 權(quán)限與所有權(quán)

創(chuàng)建 Schema

PostgreSQL

CREATE SCHEMA myschema AUTHORIZATION alice;

alice 擁有該 Schema,對(duì)象默認(rèn)歸她所有。

SQL Server

CREATE SCHEMA Sales AUTHORIZATION dbo;

MySQL

CREATE DATABASE mydb;  -- 或 CREATE SCHEMA mydb;

Oracle
通常通過(guò) CREATE USER 創(chuàng)建用戶即可間接創(chuàng)建 Schema。

授權(quán)訪問(wèn)

PostgreSQL

GRANT USAGE ON SCHEMA myschema TO bob;
GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO bob;

SQL Server

GRANT SELECT ON SCHEMA::Sales TO bob;

Oracle

GRANT SELECT ON scott.emp TO hr;

修改默認(rèn) Schema / 搜索路徑

  • PostgreSQL:SET search_path
  • SQL Server:ALTER USER … WITH DEFAULT_SCHEMA
  • MySQL:USE dbname
  • Oracle:無(wú)直接機(jī)制,登錄用戶默認(rèn)使用自身 Schema

5 Schema vs Database vs Catalog

Database

  • SQL 標(biāo)準(zhǔn):數(shù)據(jù)庫(kù)是 Catalog 的一種實(shí)現(xiàn),包含多個(gè) Schema。
  • 實(shí)際上,不同產(chǎn)品語(yǔ)義不同:
    • PostgreSQL:一個(gè) Database 包含多個(gè) Schema。
    • SQL Server:一個(gè) Database 包含多個(gè) Schema。
    • Oracle:一個(gè)數(shù)據(jù)庫(kù)實(shí)例通常只包含一組用戶 Schema。
    • MySQL:Database 與 Schema 等價(jià)。

Schema

命名空間,組織數(shù)據(jù)庫(kù)對(duì)象。

Catalog

SQL 標(biāo)準(zhǔn)中的更大邏輯容器,常對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)實(shí)例。實(shí)際中較少直接使用。

6 總結(jié)

四大主流數(shù)據(jù)庫(kù) Schema 特性對(duì)照:

特性 Oracle PostgreSQL SQL Server MySQL
Schema 與用戶關(guān)系 用戶 = Schema(1:1),創(chuàng)建用戶即創(chuàng)建 Schema Schema 獨(dú)立于用戶,用戶可擁有多個(gè) Schema 自 2005 起,Schema 與用戶分離;用戶有默認(rèn) Schema Schema = Database;無(wú)獨(dú)立 Schema 概念
默認(rèn) Schema 行為 登錄用戶即默認(rèn) Schema,例如 scott.emp search_path 決定,默認(rèn) "$user", public 用戶默認(rèn) Schema(可改),否則 fallback 到 dbo USE dbname 設(shè)定當(dāng)前數(shù)據(jù)庫(kù),表解析為 dbname.table
創(chuàng)建方式 CREATE USER scott IDENTIFIED BY pwd;(即創(chuàng)建 Schema) CREATE SCHEMA myschema AUTHORIZATION alice; CREATE SCHEMA Sales AUTHORIZATION dbo; CREATE DATABASE mydb;CREATE SCHEMA mydb;
跨 Schema 訪問(wèn) hr.employees(需權(quán)限) other_schema.table(需 USAGE 權(quán)限) Sales.Orders(需權(quán)限) otherdb.table(需權(quán)限)
權(quán)限控制 GRANT SELECT ON scott.emp TO hr; GRANT USAGE ON SCHEMA myschema TO bob;``GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO bob; GRANT SELECT ON SCHEMA::Sales TO bob; GRANT SELECT ON mydb.mytable TO 'bob'@'host';
修改默認(rèn) Schema 不支持(用戶即 Schema) SET search_path TO myschema, public; ALTER USER alice WITH DEFAULT_SCHEMA = Sales; USE dbname;
術(shù)語(yǔ)說(shuō)明 Schema ≈ User Database ? Schema Database ? Schema Schema = Database
  • Oracle:用戶就是 Schema
  • PostgreSQL:Schema 是獨(dú)立命名空間,靠 search_path 解析
  • SQL Server:Schema 獨(dú)立,用戶有默認(rèn) Schema,常見(jiàn)是 dbo
  • MySQL:Schema = Database,沒(méi)有獨(dú)立命名空間

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • PostgreSQL 是一個(gè)免費(fèi)的對(duì)象-關(guān)系(Object-Relationship)數(shù)據(jù)庫(kù)服務(wù)器(ORDBMS)...
    LeoLongl閱讀 3,480評(píng)論 0 1
  • 1. 總結(jié)pg和mysql的優(yōu)劣勢(shì)。 PostgreSQL 優(yōu)勢(shì):1、PostgreSQL基于BSD協(xié)議開(kāi)源,完全...
    Ciri_395c閱讀 82評(píng)論 0 0
  • 1.schema.xml是干什么用的? Schema.xml 作為 MyCat 中重要的配置文件之一,管理著 My...
    Johnny_Kam閱讀 13,885評(píng)論 1 3
  • 在數(shù)據(jù)庫(kù)中,schema(發(fā)音 “skee-muh” 或者“skee-mah”,中文叫模式)是數(shù)據(jù)庫(kù)的組織和結(jié)構(gòu),...
    MayerBin閱讀 1,555評(píng)論 0 0
  • 1. MySQL數(shù)據(jù)庫(kù)簡(jiǎn)介 MySQL 是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有...
    superman超哥閱讀 842評(píng)論 0 0

友情鏈接更多精彩內(nèi)容