【发布时间】:2011-01-07 19:10:58
【问题描述】:
我的数据库有两个表,一个包含用户列表,另一个包含角色列表。每个用户将属于一个或多个角色,当然每个角色将有多个用户。
我遇到了两种链接信息的方法。第一个是添加第三个表,其中包含两个表中的 ID。然后,一个简单的联接将返回属于某个角色的所有用户,或该用户所属的所有角色。但是,随着数据库的增长,这些简单查询返回的数据集将呈指数级增长。
第二种方法是向用户表中添加一列,其中存储了分隔的角色列表。这将消除对第三个链接表的需要,这可能对数据库增长产生积极影响。缺点是 SQL 没有使用分隔列表的能力。我发现处理该信息的唯一方法是使用临时表和自定义函数。
正在查看我的执行计划,“表扫描”事件是占用资源最多的事件。从等式中删除表格会加快速度,这是有道理的。该函数占用不到1%的资源。
这些测试是在少于 20 条记录的数据库上完成的。随着数据库大小的增长,表扫描将花费更长的时间,因此限制它们可能是最好的选择。
如果使用分隔列表是一种好方法,为什么没有人这样做?
请告诉我您喜欢哪种方法(即使它与我的两种不同)以及原因。
谢谢。
【问题讨论】:
-
如果您希望存储大量数据,切勿测试少量数据。在少量数据上运行良好的查询通常是在大型数据集上的狗。你得到表扫描的原因可能是你只有 20 条记录,数据库不倾向于使用索引,即使它们存在于一个很小的表中。
-
您说:“但是,随着数据库的增长,这些简单查询返回的数据集将呈指数级增长。”我无法想象这句话怎么可能是真的,即使你有和用户一样多的角色。用户所属角色的查询受用户数量限制;对于具有角色的用户,反之亦然。叉积查询将是您的数据集平方:多项式增长,而不是指数增长。
标签: sql database tsql database-design