我承认我的 SQL 知识(使用 mySQL)几乎没有超出数据库管理所需的标准查询,并且我的大部分数据操作都是通过 php 完成的。
我一直渴望改变这一点,并且到目前为止已经取得了成功,如果有人能建议我如何在包含“父”、“子”字段、内部字段的标准表上为继承查询创建存储过程,我将不胜感激。加入权限表。
作为示例数据(用于演示目的):
表组继承
parent child
------------------------
admin moderator
member guest
super_admin admin
moderator member
表组权限
moderator move_post
----------------------
super_admin create_forum
admin move_forum
guest view_post
member create_post
member edit_post
然后,我将调用组名称(例如“admin”)上的过程以返回其权限数组(“move_forum”、“view_post”、“create_post”、edit_post“)。我不知道这里是否需要迭代或递归(我读到了一些关于 mySQL 不支持这一点的内容?),但欢迎任何建议。
(注意:我选择不使用权限作为具有 TRUE/FALSE 检查的字段,因为我打算将更多字段附加到每个权限,例如描述)。
如果您正在查看树层次结构,那么嵌套集模型工作得相当好,但涉及继承表结构的重大变化。
如果您正在实现任意有向图(例如,您有一个可以发布文章但不能审核评论的“作者”配置文件,以及可以审核评论但不能发布文章的“主持人”配置文件),您可能需要查看寻求其他解决方案。
一种可能是放弃继承并手动为每个组设置权限。
另一种可能性是使用继承表来存储直接继承和间接继承(即,节点将使用“直接”关系与其所有子节点相关,以及使用“间接”关系与其所有后代相关)。此策略要求您在每次更改直接关系之一时重新创建表中的所有间接关系(这可以通过使用简单的方法来完成)INSERT SELECT
),但优点是只需要一次连接即可访问所有后代。
基本思想是:
CREATE TABLE group_inherit (
parent INT NOT NULL,
child INT NOT NULL,
distance INT NOT NULL,
PRIMARY KEY (parent,child)
);
/* Clean up indirect relations */
DELETE FROM group_inherit WHERE distance <> 0;
/* Repeat this for each D > 0 until the maximum distance is reached */
INSERT IGNORE INTO (parent, child, distance)
SELECT fst.parent, snd.child, D
FROM group_inherit fst
INNER JOIN group_inherit snd ON snd.parent = fst.child
WHERE fst.distance = 0 AND snd.distance = D - 1;
/* Select all permissions for a user type */
SELECT perm.*
FROM group_permissions perm
INNER JOIN group_inherit ON perm.moderator = child
WHERE parent = ?
应该执行距离循环,直到没有更多距离 D-1 的元素可用,这可以使用选择查询来完成,或者如果有的话,可以使用有关插入了多少行的元信息来完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)