SQL性能与冗余

时间:2014-05-23 12:43:44

标签: sql sql-server database database-design

我应该如何设计以下数据库?

我有一个表,其中每个~15000个userNames平均连接到7个组名:

TABLE usergroups
userName VarChar, groupName VarChar
Alexander, Developers
Alexander, Software
Alexander, Company
Michael, Testers
Michael, Software
Michael, London
Michael, Company

我有另一个表,我存储了管理员定义的ACL规则。

ACL规则规定允许某些用户或组以某种方式访问​​其他人或组的数据。从群组中,可以排除用户(例如老板):

TABLE aclRules
ruleId, fromUsers, toUsers, fromExclude, toExclude, permissions
1, "Software,HR","Testers,HR","Michael,Michelle","William","RWX"

我的猜测是超过500条规则无法管理,甚至可能更少。

给定两个userIds(1 - > 2)我想获取允许userId 1访问userId 2数据的所有ACL规则。这些查询将经常进行(我估计每天约15M次,但它可以甚至更多),而规则/组成员资格的变化每天不会超过1000个。

我现在看到了如何设计数据库的两种可能性。

第一种可能性:我可以通过以下方式设计帮助表:

TABLE aclUsers
ruleId int,fromUser VarChar,toUser VarChar
1,"Alexander","Michael"

并使用我在规则表中输入的组名称计算一次的所有用户名填充它。所以,事实上,它存储了冗余数据

在最坏的情况下,它会为一个规则存储15000 * 15000 = 225M条目,但是当我们期望使用它时,我们假设整体上大约有10M条目。 问题是:当组被更改时,我将不得不重建此表。

但至少ACL查询很容易 - 希望也很快:

SELECT FROM aclRules WHERE ruleId IN
(SELECT ruleId FROM aclUsers WHERE fromUser = @userName1 AND toUser = @userName2)

(通过加入可以更轻松地完成)

第二种可能性:我可以动态计算群组成员资格。

我当然会将用户,使用者,fromExclude和exclude从aclRules表拆分为四个不同的表格,以便于访问:

TABLE aclFromUser
ruleId int, fromUser VarChar
1, Software
1, HR

TABLE aclToUser
ruleId int, toUser VarChar
1, Testers
1, HR

TABLE aclFromExclude
ruleId int, fromExclude VarChar
1, Michael
1, Michelle

TABLE aclToExclude
ruleId int, toExclude VarChar
1, William

我的估计是每个表都有大约1000个条目。

查询看起来像

SELECT FROM aclRules WHERE 
    ruleId IN(SELECT ruleId FROM aclFromUser WHERE fromUser IN(SELECT groupname FROM usergroups WHERE username = @userName1))
AND ruleId IN(SELECT ruleId FROM aclToUser WHERE toUser IN(SELECT groupname FROM usergroups WHERE username = @userName2))
AND ruleId NOT IN(SELECT ruleId FROM aclFromExempt WHERE fromExclude IN(SELECT groupname FROM usergroups WHERE username = @userName1))
AND ruleId NOT IN(SELECT ruleId FROM aclToExempt WHERE toExclude IN(SELECT groupname FROM usergroups WHERE username = @userName2))

(如果我将其作为存储过程实现,它应该运行得更快)

这使我无法将用户组表的更改同步到冗余aclUsers表中,但它将如何影响执行时间?

我应该选择哪种设计?为什么?

第二个版本的时间惩罚是多少?

0 个答案:

没有答案