2011-10-30 46 views
42

要比較不同供應商(Oracle,SQL Server,DB2,MySQL和PostgreSQL)的數據庫,如何唯一標識任何對象,並且是否需要目錄?例如,在Java的DatabaseMetadata中,我應該至少指定目錄和模式fooPattern。目錄,模式,用戶和數據庫實例之間的關係

目錄僅僅是數據存儲的抽象是真的嗎?

回答

81

在Oracle:

  • 服務器實例==數據庫==目錄==由相同執行引擎
  • 模式==數據庫中的命名空間,相同的用戶帳戶
  • 用戶管理的所有數據==模式所有者==命名帳戶,與模式相同,可以連接到數據庫,誰擁有模式並可能在其他模式中使用對象
  • 要識別正在運行的服務器中的任何對象,您需要(模式名稱+對象na我)

在PostgreSQL:

  • 服務器實例==分貝簇==由相同執行引擎
  • 數據庫管理的所有數據==目錄==分貝集羣內單個數據庫,孤立來自同一數據庫集羣中的其他數據庫
  • 模式==數據庫內的命名空間
  • 用戶==命名帳戶,誰可以連接到數據庫,擁有並使用每個允許的對象中的對象tabase分別
  • 識別正在運行的服務器的任何對象,你需要(數據庫名+架構名稱+對象名稱)

在MySQL:

  • 服務器實例==不與目錄確定,只是一組數據庫
  • 數據庫==模式==目錄==服務器內的命名空間。
  • 用戶==指定帳戶,誰是可以連接到服務器,並使用(但可以自己不- 沒有所有權的概念)在一個或多個數據庫
  • 對象,以確定正在運行的服務器的任何對象,你需要(數據庫名稱+對象名稱)

在Microsoft SQL Server:管理數據庫

  • 服務器實例==集
  • 數據庫==服務器內的命名空間預選賽中,很少被稱爲目錄
  • 模式== ==車主數據庫中的命名空間,依賴於數據庫角色,默認情況下只dbo用於
  • 用戶==指定帳戶,誰可以連接到服務器,並使用(但不能自己 - 架構可以作爲所有者)在一個或多個數據庫對象
  • 識別正在運行的服務器的任何對象,你需要(數據庫名稱+所有者+對象名稱)

所以我覺得回答你的問題是:

  1. 它取決於實現,是否需要目錄名稱來標識對象。 「目錄」,「模式」和「數據庫」的含義因實施方式而異。

  2. 是的,目錄是數據存儲的抽象。我認爲它也應該被定義爲一個獨立的獨立的命名空間,但並不是所有的SQL引擎都這樣做。

  3. 數據庫模式都很好,所有供應商定義。 目錄有時是「數據庫」(至少在Oracle和Postgres中)的同義詞,有時與「模式」同義,有時與兩者同義。術語目錄也經常表示元數據收集(又名系統表)。

+2

好居多。我會多說一點Oracle。 Oracle的說法中的「數據庫」實際上是可以被一個或多個「實例」訪問的文件集。這就是RAC如何運作AFAIK,與其他引擎集羣顯着不同。另外,考慮到大多數數據庫引擎通常只能訪問給定連接上的一個「目錄」,我不確定目錄在哪裏有用。在JDBC中,模式字段標識了我認爲在所有流行引擎中的這個級別,當然還有MySQL,PostgreSQL,Oracle和SQL Server。這些中的每一個都需要不同的jdbc url來用於不同的「目錄」。 – PlexQ

+1

對於MySQL,當使用JDBC時,它似乎將模式標識爲一個目錄:'TABLE_CAT:iserver,TABLE_SCHEM:null,TABLE_NAME:accountgroups,TABLE_TYPE:TABLE,REMARKS:'。 TABLE_SCHEM字段爲空白。根據這個輸出結果,我會預期在目錄字段中看到的內容在模式字段中。 JDBC定義是否可能關閉,或者MYSQL目錄可能與模式相同? –

+2

是的,我同意@ SamGoldberg。另一個證據是這個SHOW SCHEMAS是SHOW DATABASES的同義詞(http://dev.mysql.com/doc/refman/5.1/en/show-databases.html)。更新了上面的答案以反映這一點。 –

5

對於DB2,架構用作名稱空間。所以,如果你想唯一標識一個數據庫中的對象,你會說* schema.object_name *。這是實現多租戶的非常方便的方法。您可以爲數據庫中的每個租戶擁有單獨的架構。這提供了安全以及管理方面的關注的良好分離。您可以在單個DB2數據庫中擁有32K模式。

DB2中的目錄只是包含有關數據庫元數據的系統表集合。通常,直接訪問目錄對象被認爲是不好的做法。最好使用API​​提供的工具(例如JDBC)來瀏覽目錄及其包含的元數據。

DB2也有其他抽象層。您可以在同一臺計算機上運行多個DB2實例。每個實例可以管理256個獨立的數據庫(每個數據庫都有32K模式)。服務器上DB2實例的數量僅受限於可用內存量。在某個時間點,我們在Amazon EC2 m1.large上運行了120個DB2實例(每個實例都有一個數據庫和10個連接)。 您也可以在單個服務器上安裝多個DB2。測試您計劃遷移到的新版本時非常有用。雖然經常忘記切換到正確的安裝,但我發現它很混亂。

+1

但是,在計算機上放置多個實例以及使用SQL Server甚至多個數據庫時,需要考慮事務日誌。擁有單獨的事務日誌的主要好處之一是它可以順序寫入存儲設備,而使用基於主軸的存儲比在寫入/讀取之間執行查找要快得多。後臺進程收集髒數據庫塊並將它們寫入磁盤,優化寫入順序,除非強制檢查點導致所有髒塊被刷新。 – PlexQ

3
+0

感謝您的更新。 – filiprem

相關問題