5

考慮一個數據庫服務器,其今天的工作是容納一個數據庫。可能數據庫將在未來移動到另一個數據庫實例,該實例包含多個數據庫模式。SQL Server:命名模式的約定

讓我們假裝應用/項目稱爲Invoicer 2.0。數據庫被稱爲AcmeInvoice。數據庫包含所有發票,客戶和產品信息。以下是演員及其角色和行爲的圖表。

alt text

的模式(一個或多個)將在很大程度上被用來很容易地將權限分配給角色。這裏額外的好處是對象不在dbo之下,而且對象&權限可以在將來移植到另一臺機器上。

問題

  • 你當命名架構使用什麼約定?
  • 將模式命名爲與數據庫相同的名稱是否很好?

回答

4

我認爲如果您的模式名稱最終與您的數據庫模式相同,那麼您只是爲您的數據庫添加冗餘。在數據庫中查找具有共同範圍或目的的對象,並創建一個模式來反映該範圍。因此,例如,如果您有一個發票實體,並且您有一些支持發票狀態的查詢表等,則將它們全部放入發票模式中。

作爲一般的經驗法則,我會盡量避免使用反映應用程序名稱,數據庫名稱或其他具體/物理事物的名稱,因爲它們可以更改,並找到一個概念上代表對象範圍的名稱這將進入模式。

您的評論指出「模式將主要用於輕鬆分配角色權限」。您的圖表顯示了可以訪問某些/所有表格或某些/所有存儲的特效的特定用戶類型。我認爲試圖在概念上將對象組織到模式中並從安全角度將它們組織到模式中是相互衝突的事情。我贊成在sql server中創建角色以反映用戶的類型,並授予這些角色訪問每個用戶類型所需的特定對象的權限,以便授予角色或用戶訪問模式以構建安全框架。

4

爲什麼要將模式命名爲與數據庫相同?這意味着所有的數據庫對象都屬於同一個模式。如果是這樣的話,爲什麼要有一個架構呢?

典型的模式是用來在活動或功能的共同範圍內對對象進行分組。例如,根據您所描述的內容,您可能具有發票模式,客戶模式和產品模式。所有與發票相關的對象都將進入發票模式,所有與客戶相關的對象都將進入客戶模式,而產品則相同。

我們經常會使用Common架構,其中包含可能對我們整個應用程序通用的對象。

+0

同意,這就像是命名一個表tblCustomers。您知道AcmeInvoice中的對象屬於AcmeInvoice,因爲它們在該數據庫中。 AcmeInvoice.AcmeInvoice.Customers與AcmeInvoice.dbo.Customers相反的目的是什麼? –

+0

@pcampbell - 那不是我做的嗎?我建議你將模式命名爲功能線或活動線。 –

1

我會調用數據庫AcmeInvoice(或其他合適的名稱)和架構Invoicer2。

我的理由如下:Acmeinvoice意味着我將所有的應用程序對象/數據分組在一起。因此它可以作爲一個單元移動到其他機器上(備份/恢復或未連接/附加)。

該模式將是Invoicer2。應用程序發生變化,將來可能會有Invoicer21(您將創建一個模式)或者報告模塊或系統(Reports模式)。 我發現模式的使用允許我將一個數據庫中的數據/過程分成不同的組,這使得管理員權限變得更容易。