这是一个简化的例子。
UserDetails (UserID INT UserGUID UNIQUEIDENTIFIER Name VARCHAR(50) Age INT)
UserRatings (UserID INT Rating INT Date DATETIME)
UserVotes (UserID INT Votes INT Date DATETIME)
UserGUID仅存在于主表中。
在应用程序层中,只解析GUID,而不是INTS。这是为了防止竞争对手猜测我网站上的某些关键数字(例如用户数)。
在与UserRatings和UserVotes表相关的SPROCS中,我必须根据在每个过程开始时被解析回来的UserGUID来DECLARE UserID并设置它。
这不仅发生在Users表中,而且发生在具有主表和分支表的每个其他对象上,因此这些DECLARE / SET类型的程序遍布整个地方。
这是一个好的设计吗?
答案 0 :(得分:3)
UserGUID仅存在于main中 表。仅在应用程序层中 GUID被解析,从不INTS。 这是为了防止竞争对手 猜测我的一些关键数字 网站喜欢(例如用户数)。
对我来说似乎很合理。
在与表有关的SPROCS中 UserRatings和UserVotes,我必须 DECLARE UserID并基于它设置它 正在解析的UserGUID 在每个程序的开始。
您还可以定义跨UserDetails+UserRatings
以及UserDetails+UserVotes
(甚至一次全部三个表)的视图,其中包括UserDetails
表中的GUID。这样可以更容易地查询表,并且您不必首先从GUID中提取ID并使用它来查询相关表。
更新:需要经常查询UserRatings
,您可以创建这样的视图:
CREATE VIEW dbo.UserRatingsWithDetails
AS
SELECT
ud.UserGuid, ud.Name, ud.Age,
ur.UserID, ur.Rating, ur.Date
FROM
dbo.UserDetails ud
INNER JOIN
dbo.UserRatings ur ON ur.UserID = ud.UserID
然后您可以从该视图中进行选择,而无需先运行单独的SELECT
:
SELECT UserID, Name, Rating, Date
FROM dbo.UserRatingsWithDetails
WHERE UserGuid = @SomeGuidValue
使用正确的索引(在UserRatings
中的外键字段上),这是一个非常高性能的JOIN - 不用担心!
答案 1 :(得分:1)
我会删除uniqueidentifier UserGUID列,只使用plain int UserID。如果你想使ID随机混淆/混淆,那么只需删除标识并使用一些函数/过程,每次插入一个新用户时,该函数/过程随机生成一个值为1到2,147,483,647之间的普通int。