我被告知要在表中创建一个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
表数据对于我。请评论您对此的看法。
答案 0 :(得分:1)
我被告知要使用GUID varchar在表中创建一个autID标识列 (40)作为主键并使用autID列作为参考键来帮助进行连接过程。但这是一个好方法吗?
有人混淆了群集和主键,告诉了你这一点。它们不是同一个,尽管数据库引擎的混乱实施“帮助”了懒惰的开发人员。
您可能会获得有关向每个表添加标识列并将其指定为主键的参数。我不同意这一切。一个人不会在模式中盲目地做这种类型的任何事情。您进行适当的分析,识别(并强制执行)任何自然键,然后确定合成键是否有用且是否需要。然后确定要用于聚簇索引的列(因为您只有一列)。然后,根据测试加载架构的效率和效率,验证决策是否合适。关于如何实现架构没有绝对的规则。
您的许多索引(并且再次注意 - 索引和主键是完全不同的东西)选择将受到表的更新方式的影响。您是否有需要最小化的热点?随着时间的推移,您的表会经历大量随机插入,更新和删除吗?或者可能只是很多插入但相对较少的更新或删除?这些只是指导您决策的一些因素。
答案 1 :(得分:0)
您需要为GUID列而不是VARCHAR
使用UNIQUEIDENTIFIER数据类型答案 2 :(得分:0)
据我所知,自动增量int 是最适合聚集索引的列。
strClientID
是PK或群集索引的最差候选者。
最重要的是,你没有提到StrClientID
的目的。它包含什么样的数据,如何填充?