最好将模式指定为约束名称的一部分?

时间:2012-02-09 21:08:29

标签: sql sql-server

在我的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 个答案:

答案 0 :(得分:5)

从技术上讲,约束属于与其基表相同的模式。您也无法在不指定表的情况下引用约束。您可以在以下代码段中看到:

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 :(得分:4)

我认为添加模式名称是一个很好的做法,因为你已经提到过(跨模式重复表名),我不担心约束名称的详细程度,因为你很少需要引用这些约束。 / p>

答案 2 :(得分:3)

我意识到这是一个老线程,但我需要一个答案,所以也许其他人也这样做...

显然,相同的键/索引名称和检查约束名称​​可以确实在同一个数据库中的不同模式中重复,所以我同意上述注释,并没有看到添加点模式名称作为约束名称的一部分

E.g。以下代码适用于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

答案 3 :(得分:2)

一种可能性是给每个表一个短表别名,例如

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

并使用约束名称,如

PK_wus
FK_wus_com
UQ_wus_CompanyID_Username

如果添加了新表,请为它们指定新的唯一别名。

我参与了一个项目,其中列名称以此表别名为前缀

com_CompanyID
com_Name