在mySQL中存储用户网站权限和查询的方法?

时间:2010-12-27 17:51:28

标签: php mysql

我有什么:

我的表中有一个名为privileges的列,用于存储用户的一系列权限。 (-1 =所有者,0 =管理员,1 =中等评论等)所以我在sql中会有这样的字符串:1,2,3

问题:

如果我想选择所有管理员和版主的用户,那么LIKE条件会变得有点棘手。现在,如果我想要一个管理员,我只需要遍历所有用户搜索1(使用PHP - 效率低下)。

我正在寻找一个易于被插件开发人员“插入”的解决方案,并且很容易查询。我的解决方案有效,但如果用户增长到数百个,可能需要一段时间才能重复遍历所有这些用户才能获得某种特权。

有没有人对此有更好的方法或想法?

3 个答案:

答案 0 :(得分:3)

为什么不使用像Priviledge这样的表,它包含一个id和一个名字。然后添加一个与used_id和priviledge_id相关的多对多UserPriviledge表,然后查找用户就像创建INNER_JOIN一样简单

答案 1 :(得分:1)

SELECT  *
FROM    privileges
WHERE   FIND_IN_SET(0, privilege)
        AND FIND_IN_SET(1, privilege)

如果规范化表格,您将获得更快的查询(创建一个额外的表user_privileges,每个权限具有单独的记录)。这样你就可以运行:

SELECT  user
FROM    user_privileges
WHERE   privilege IN (0, 1)
GROUP BY
        user
HAVING  COUNT(*) = 2

这可以使用privilege上的索引。

您也可以考虑将权限存储在本机SET数据类型中。

答案 2 :(得分:1)

你的桌子应按照guiman的建议进行标准化。每个维基百科:规范化表适用于通用查询。这意味着支持针对这些表的任何查询,包括无法预测其详细信息的未来查询。相比之下,未规范化的表适用于某些类型的查询,但不适用于其他类型的查询。