2012-02-09 38 views
4

在我的SQL Server數據庫中,我按模式對錶進行分組,以幫助組織他們的目的。指定模式作爲約束名稱的一部分的好主意?

當我爲這些表上的列創建約束時,我一直在將Schema作爲名稱的一部分。舉例來說,如果我有一個表,如Com.WebUserCom.Company

PK_Com_WebUser      --Primary key constraint 
FK_Com_WebUser_Com_Company   --Foreign key to Com.Company table 
UQ_Com_WebUser_CompanyID_Username --Unique constraint on CompanyID & Username 

我在我曾經用相同名稱的另一個表在不同的模式把架構的約束名稱會使事情更清晰的情況下想通,但名稱有點冗長。

是否有命名這些對象的最佳做法?

回答

4

我認爲添加模式名是一個很好的習慣,因爲你已經提到過(表模式中重複的表名),我不擔心約束名是多麼冗長,因爲你很少需要引用這些約束。

2

一種可能性是給每個表一個短表的別名,例如,

Com.Customer => cst 
Com.Company => com 
Com.WebUser => wus 

,並使用像

PK_wus 
FK_wus_com 
UQ_wus_CompanyID_Username 

如果添加了新的表約束的名字,給他們新的唯一的別名。

我的工作,其中列名都帶有前綴此表的別名

com_CompanyID 
com_Name 

2

技術上的約束屬於相同的架構,因爲它的基表中的項目。如果不指定表格,也不能引用約束。您可以看到,在以下代碼片段中:

CREATE SCHEMA s1; 
GO 
CREATE SCHEMA s2; 
GO 
CREATE TABLE s1.T(i int CONSTRAINT tpk PRIMARY KEY); 
GO 
CREATE TABLE s2.T(i int CONSTRAINT tpk PRIMARY KEY); 
GO 
SELECT OBJECT_SCHEMA_NAME(object_id) SchemaName,name,type_desc FROM sys.objects WHERE schema_id IN (SCHEMA_ID('s1'),SCHEMA_ID('s2')); 
GO 

唯一的例外是OBJECT_ID函數。在那裏你可以引用一個約束而不指定它的基表。但是,使用此功能時,你應該始終指定架構以及反正:

SELECT OBJECT_ID('s1.tpk'),OBJECT_ID('s2.tpk'); 

由於上述所有我考慮把架構名稱進入該限制的名稱是多餘的重複。所以,堅持DRY原則,你不應該這樣做。

1

我意識到這是一個古老的線程,但我需要一個答案,所以也許別人不會太...

顯然,相同的鍵/索引名和檢查約束名稱可以的確可以重複在同一個數據庫中的不同模式中,所以我同意上面的註釋,並且沒有看到將模式名稱添加爲約束名稱的一部分的要點

例如以下代碼適用於SQL 2012和2008 R2,無錯誤

-- create a table in the dbo schema, with primary key 
CREATE TABLE dbo.Children (
    id_Child int IDENTITY(1,1) NOT NULL, 
    ChildName varchar(50) NULL, 
    id_Parent int NOT NULL, 
CONSTRAINT PK_Children PRIMARY KEY CLUSTERED (id_Child ASC) 
) 
GO 

-- now an index and a check constraint 
CREATE NONCLUSTERED INDEX IX_Children_ChildName ON dbo.Children (ChildName ASC) 
GO 
ALTER TABLE dbo.Children WITH CHECK ADD CONSTRAINT CK_Children_LongEnough CHECK (len([ChildName])>(3)) 
GO 


-- now create another schema 
CREATE SCHEMA test AUTHORIZATION dbo 
GO 

-- an indentical table in the other schema, with a PRIMARY KEY OF THE SAME NAME 
CREATE TABLE test.Children (
    id_Child int IDENTITY(1,1) NOT NULL, 
    ChildName varchar(50) NULL, 
    id_Parent int NOT NULL, 
CONSTRAINT PK_Children PRIMARY KEY CLUSTERED (id_Child ASC) 
) 
GO 

-- now an index and a check constraint on the alternate table in another schema, with 
-- the IDENTICAL NAMES 
CREATE NONCLUSTERED INDEX IX_Children_ChildName ON test.Children (ChildName ASC) 
GO 
ALTER TABLE test.Children WITH CHECK ADD CONSTRAINT CK_Children_LongEnough CHECK (len([ChildName])>(3)) 
GO