在我的SQL Server数据库中,我按模式对表进行分组,以帮助组织其目的。
当我为这些表的列创建约束时,我一直将Schema作为名称的一部分。例如,如果我有一个表格,例如Com.WebUser
和Com.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
我认为在这种情况下,我在另一个模式中有另一个具有相同名称的表,将模式放在约束名称中会使事情变得更清楚,但名称有点冗长。
是否有最佳实践来命名这些对象?
答案 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
等