在具有varchar类型的主键的表中具有Identity列

时间:2017-04-28 01:04:46

标签: sql sql-server foreign-keys guid

我被告知要在表中创建一个autID标识列,其中GUID为varchar(40)作为主键,并使用autID列作为参考键来帮助加入过程。但这是一个好方法吗?

这导致很多像这样的问题

CREATE TABLE OauthClientInfo
(
    autAppID INT IDENTITY(1,1)
    strClientID VARCHAR(40),   -- GUID
    strClientSecret VARCHAR(40) 
)

CREATE TABLE OAuth_AuthToken
(
    autID INT IDENTITY(1,1)
    strAuthToken VARCHAR(40),
    autAppID_fk INT 
        FOREIGN KEY REFERENCES OauthClientInfo(autAppID)
)

我被告知让autAppID_fk帮助加入与strClientID_fk varchar(40)有关,但我要防守的是我们不必要地添加一个新的id作为参考,有时强迫加入。

示例,要了解strClientID所属的strAuthToken是什么,如果我们将strClientID_fk作为参考密钥,则OAuth_AuthToken表数据对于我。请评论您对此的看法。

3 个答案:

答案 0 :(得分:1)

  

我被告知要使用GUID varchar在表中创建一个autID标识列   (40)作为主键并使用autID列作为参考键来帮助进行连接过程。但这是一个好方法吗?

有人混淆了群集和主键,告诉了你这一点。它们不是同一个,尽管数据库引擎的混乱实施“帮助”了懒惰的开发人员。

您可能会获得有关向每个表添加标识列并将其指定为主键的参数。我不同意这一切。一个人不会在模式中盲目地做这种类型的任何事情。您进行适当的分析,识别(并强制执行)任何自然键,然后确定合成键是否有用且是否需要。然后确定要用于聚簇索引的列(因为您只有一列)。然后,根据测试加载架构的效率和效率,验证决策是否合适。关于如何实现架构没有绝对的规则。

您的许多索引(并且再次注意 - 索引和主键是完全不同的东西)选择将受到表的更新方式的影响。您是否有需要最小化的热点?随着时间的推移,您的表会经历大量随机插入,更新和删除吗?或者可能只是很多插入但相对较少的更新或删除?这些只是指导您决策的一些因素。

答案 1 :(得分:0)

您需要为GUID列而不是VARCHAR

使用UNIQUEIDENTIFIER数据类型

答案 2 :(得分:0)

据我所知,自动增量int 是最适合聚集索引的列。

strClientID是PK或群集索引的最差候选者。

最重要的是,你没有提到StrClientID的目的。它包含什么样的数据,如何填充?