Jes*_*lam 0 t-sql sql-server database-design
观察下表模型:
CREATE TABLE [site].[Permissions] (
[ID] INT REFERENCES [site].[Accounts]( [ID] ) NOT NULL,
[Type] SMALLINT NOT NULL,
[Value] INT NULL
);
Run Code Online (Sandbox Code Playgroud)
site.Accounts-> site.Permissions是一对多关系,因此由于PK强加的唯一性,'ID'不能成为主键.
使用WHERE [ID] = ?子句选择行,因此添加一个虚假的IDENTITY列并使其成为PK会产生额外的磁盘空间.
据我所知,目标平台 - SQL Server(2008) - 不支持复合PK.这些都加起来我的问题:如果没有使用主键,那么有什么不对吗?或者可能更正确的事情?
您的理解不正确,SQL Server确实支持复合主键!
添加一个的语法是
ALTER TABLE [site].[Permissions]
ADD CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (id,[Type])
Run Code Online (Sandbox Code Playgroud)
关于评论中的问题"将PK放在整个桌子上有什么好处?"
虽然PK需要什么,但我不确定你的描述.是全部3列还是只有2列?如果它打开id,[Type]那么可能你不希望相同的id,[Type] 组合可能出现多次与冲突值的可能性.
如果它出现在所有3列上,那么就可以解决为什么不想要主键?
如果要在表上创建聚簇索引,可以将其作为主键.如果说你在做一个聚集索引id列只SQL服务器将增加在uniqueifiers无论如何,使其独特的和你的列是如此狭窄(int,smallint,int)这似乎只是一个毫无意义的补充.
此外,查询优化器可以使用唯一约束来改进其查询计划(尽管可能不适用,如果该表上的唯一查询确实是这样WHERE [ID] = ?),并且允许重复,然后您必须同时存储和过滤掉它们将是非常浪费的DISTINCT.
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |