数据库设计问题:处理GUID周围的地方

时间:2010-07-28 15:25:51

标签: database-design guid

这是一个简化的例子。

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类型的程序遍布整个地方。

这是一个好的设计吗?

2 个答案:

答案 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。