要比較不同供應商(Oracle,SQL Server,DB2,MySQL和PostgreSQL)的數據庫,如何唯一標識任何對象,並且是否需要目錄?例如,在Java的DatabaseMetadata中,我應該至少指定目錄和模式fooPattern。目錄,模式,用戶和數據庫實例之間的關係
目錄僅僅是數據存儲的抽象是真的嗎?
要比較不同供應商(Oracle,SQL Server,DB2,MySQL和PostgreSQL)的數據庫,如何唯一標識任何對象,並且是否需要目錄?例如,在Java的DatabaseMetadata中,我應該至少指定目錄和模式fooPattern。目錄,模式,用戶和數據庫實例之間的關係
目錄僅僅是數據存儲的抽象是真的嗎?
在Oracle:
在PostgreSQL:
在MySQL:
在Microsoft SQL Server:管理數據庫
dbo
用於所以我覺得回答你的問題是:
它取決於實現,是否需要目錄名稱來標識對象。 「目錄」,「模式」和「數據庫」的含義因實施方式而異。
是的,目錄是數據存儲的抽象。我認爲它也應該被定義爲一個獨立的獨立的命名空間,但並不是所有的SQL引擎都這樣做。
數據庫和模式都很好,所有供應商定義。 目錄有時是「數據庫」(至少在Oracle和Postgres中)的同義詞,有時與「模式」同義,有時與兩者同義。術語目錄也經常表示元數據收集(又名系統表)。
對於DB2,架構用作名稱空間。所以,如果你想唯一標識一個數據庫中的對象,你會說* schema.object_name *。這是實現多租戶的非常方便的方法。您可以爲數據庫中的每個租戶擁有單獨的架構。這提供了安全以及管理方面的關注的良好分離。您可以在單個DB2數據庫中擁有32K模式。
DB2中的目錄只是包含有關數據庫元數據的系統表集合。通常,直接訪問目錄對象被認爲是不好的做法。最好使用API提供的工具(例如JDBC)來瀏覽目錄及其包含的元數據。
DB2也有其他抽象層。您可以在同一臺計算機上運行多個DB2實例。每個實例可以管理256個獨立的數據庫(每個數據庫都有32K模式)。服務器上DB2實例的數量僅受限於可用內存量。在某個時間點,我們在Amazon EC2 m1.large上運行了120個DB2實例(每個實例都有一個數據庫和10個連接)。 您也可以在單個服務器上安裝多個DB2。測試您計劃遷移到的新版本時非常有用。雖然經常忘記切換到正確的安裝,但我發現它很混亂。
但是,在計算機上放置多個實例以及使用SQL Server甚至多個數據庫時,需要考慮事務日誌。擁有單獨的事務日誌的主要好處之一是它可以順序寫入存儲設備,而使用基於主軸的存儲比在寫入/讀取之間執行查找要快得多。後臺進程收集髒數據庫塊並將它們寫入磁盤,優化寫入順序,除非強制檢查點導致所有髒塊被刷新。 – PlexQ
在這裏提到的有關mysql在post by filiprem中提到的東西似乎是不正確的。根據以下鏈接,在mysql中,jdbc目錄對應於數據庫。 jdbc模式不受支持。
感謝您的更新。 – filiprem
好居多。我會多說一點Oracle。 Oracle的說法中的「數據庫」實際上是可以被一個或多個「實例」訪問的文件集。這就是RAC如何運作AFAIK,與其他引擎集羣顯着不同。另外,考慮到大多數數據庫引擎通常只能訪問給定連接上的一個「目錄」,我不確定目錄在哪裏有用。在JDBC中,模式字段標識了我認爲在所有流行引擎中的這個級別,當然還有MySQL,PostgreSQL,Oracle和SQL Server。這些中的每一個都需要不同的jdbc url來用於不同的「目錄」。 – PlexQ
對於MySQL,當使用JDBC時,它似乎將模式標識爲一個目錄:'TABLE_CAT:iserver,TABLE_SCHEM:null,TABLE_NAME:accountgroups,TABLE_TYPE:TABLE,REMARKS:'。 TABLE_SCHEM字段爲空白。根據這個輸出結果,我會預期在目錄字段中看到的內容在模式字段中。 JDBC定義是否可能關閉,或者MYSQL目錄可能與模式相同? –
是的,我同意@ SamGoldberg。另一個證據是這個SHOW SCHEMAS是SHOW DATABASES的同義詞(http://dev.mysql.com/doc/refman/5.1/en/show-databases.html)。更新了上面的答案以反映這一點。 –