我有什么:
我的表中有一个名为privileges
的列,用于存储用户的一系列权限。 (-1 =所有者,0 =管理员,1 =中等评论等)所以我在sql中会有这样的字符串:1,2,3
。
问题:
如果我想选择所有管理员和版主的用户,那么LIKE
条件会变得有点棘手。现在,如果我想要一个管理员,我只需要遍历所有用户搜索1(使用PHP - 效率低下)。
我正在寻找一个易于被插件开发人员“插入”的解决方案,并且很容易查询。我的解决方案有效,但如果用户增长到数百个,可能需要一段时间才能重复遍历所有这些用户才能获得某种特权。
有没有人对此有更好的方法或想法?
答案 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的建议进行标准化。每个维基百科:规范化表适用于通用查询。这意味着支持针对这些表的任何查询,包括无法预测其详细信息的未来查询。相比之下,未规范化的表适用于某些类型的查询,但不适用于其他类型的查询。