2010-11-02 51 views
3

我正在尋找如何在我的項目目錄中最好地組織新的Oracle模式和相關文件的建議 - 包括序列,觸發器,DDL等。我一直在使用一個名爲schema.sql的monolothic文件一段時間,但我想知道是否有最佳做法?像...構建Oracle DB;好的目錄佈局

database/ 
    tables/ 
     person.sql 
     group.sql 
    sequences/ 
     person.sequence 
     group.sequence 
    triggers/ 
     new_person.trigger 

便士爲您的想法或我可能錯過了一個URL!

謝謝!

+1

你可以看看liquibase http://www.liquibase.org/tutorial-using-oracle採取的方法 – crowne 2011-12-06 15:38:21

回答

3

按對象類型存儲DDL是一種合理的方法 - 任何事情都可能比整體SQL腳本更容易導航。但個人而言,我寧願按功能組織DDL。例如,如果您正在構建會計系統,則可能需要一系列對象來管理應付帳款和一組單獨的對象以管理應收帳款以及一些用於管理總帳科目的核心對象。這將導致一些沿

database/ 
    general_ledger/ 
    tables/ 
    packages/ 
    sequences/ 
    accounts_receivable/ 
    tables/ 
    packages/ 
    sequences/ 
    accounts_payable/ 
    tables/ 
    packages/ 
    sequences 

行由於系統變得更加複雜,層次自然會隨着時間的推移更深。這種方法更自然地反映了非數據庫代碼存儲在源代碼控制中的方式。你不會的Java類的一個目錄中的目錄結構像

middle_tier/ 
    java/ 
    Foo.java 
    Bar.java 

您將組織從實現業務邏輯的不同位的類都實現了同樣類型的業務邏輯的共同和獨立的類。

2

需要考慮的一件事是那些可以充當'僅限最新'腳本的SQL。這些包括CREATE或REPLACE PROCEDURE/FUNCTION/TRIGGER等。您運行最新版本,並且您不擔心數據庫中以前可能存在的內容。

另一方面,您有表格,您可以從CREATE TABLE開始,隨後是幾個ALTER TABLE作爲對模式演變的更改。如果您正在進行升級,您可能需要應用幾個ALTER TABLE腳本(最好按順序)。

我會反對'功能分組',除非它真的很明顯在哪裏畫線。你可能不想處於一個組中有USERS表的位置,另一個位置是USER_AUTHORITIES,第三個位置是AUTHORITY組。

如果你確實有很好的分離,那麼它們可能在單獨的模式中,並且你希望保持模式不同(因爲你可以在不同的模式中具有相同的對象名稱)。

0

按對象類型排列,在數據庫目錄下添加「模式」目錄很適合我。

我已經與具有附加分層功能的源代碼管理系統一起工作 - 如果有許多對象,如果您試圖交叉引用源代碼管理文件和您的對象在通常按類型對對象進行分組的數據庫GUI導航器中查看。如何以這種方式分類對象也並不總是清楚。

考慮爲該模式對其他模式或角色授予的授予添加「授予」目錄,每個受讓人有一個文件。如果您有「基於規則的」授予,例如「APPLICATION_USER角色總是在所有模式X的表上獲得SELECT」,則編寫一個PL/SQL匿名塊來執行此操作。(您可能會試圖通過某種臨時方法對授權進行逆向工程,但在將新表或視圖添加到應用程序時很容易錯過某些內容)。

標準化所有腳本的分隔符,並且如果您通過Ant等構建實用程序開始部署,則會使您的生活更輕鬆。使用「/」(vs.「;」)既適用於SQL語句,也適用於PL/SQL匿名塊。

0

在我們的項目中,我們使用有些組合法:我們有計劃的子文件夾中的一個核心爲根,其他功能:

root/ 
    plugins/ 
    auth/ 
    mail/ 
    report/ 

在所有這些文件夾,我們有兩個DDL和DML腳本幾乎所有這些腳本都可以運行一次,例如所有包都定義爲create or replace...,所有數據插入腳本都會檢查數據是否已經存在等等。這讓我們有機會幾乎所有的腳本都沒有想到我們會崩潰。

顯然,這種情況不能應用於create table和類似的聲明。對於這些腳本,我們手動編寫了一個小型bash腳本,用於提取指定的文件,並在特定的ORA錯誤時運行它們,例如:ORA-00955: name is already used by an existing object

而且所有文件都混在了目錄,但與擴展不同:.seq無二序列,.tbl無二表,.pkg無二封裝接口,.bdy無二封裝體,.trg去觸發的等等...

另外,我們有一個命名約定,表示我們的所有文件的前綴:我們可以cl_oper.tblcl_oper.seqcl_oper.trg序列和觸發器和cl_oper_processing.pkg連同cl_oper_processing.bdy與提及的目的邏輯。在文件管理器中使用這種命名約定,可以很容易地看到與我們的項目的某些邏輯單元相關的所有文件(而按目標類型在目錄中分組時不提供此功能)。

希望這些信息能以某種方式幫助你。如果您有任何問題,請留下評論。