我最近一直在为数据库规范化和外键之间的关系在联结表和查找表方面摸不着头脑。
我目前有以下表格:Users、UserTypes、Roles、UsersInRoles 和 Permissions。UserTypes 只是一个查找表,通过 Users 表中的外键提供类型的名称和描述。角色是具有通过 UsersInRoles 表链接到每个用户的相关权限的各种角色。
我需要想出一个结构,允许我为每个用户提供多个角色,此外还为每个相应用户提供特殊权限,这些权限可能未包含在他们所属的固定角色中。
我从 Users 表中获得了我的 UsersInRoles 表的外键,但我认为它没有意义。相反,使用从 Users 表到 UserTypes 表的外键似乎很有意义。这是经验法则吗?联结表有外键链接到它所连接的表的主键,而主表有外键链接到关联查找表的主键?
参数:
- 每个用户可以有一个或多个角色
- 每个角色都有一组固定的权限
- 每个用户都可以拥有其角色未提供的额外权限
我怀疑我可能还需要一个 PermissionsInRoles 联结表以及一个用于 PermissionsInUsers 的联结表?但这很荒谬不是吗?必须有更好的方法。我完全相信我在这里疯了,哈哈。任何帮助将不胜感激。这让我头晕目眩:P
更新
这基本上是如何设置的?我可能会去掉 UsersInRoles 表,这样每个用户只能担任一个角色,并且可以通过 SpecialPermissions 联结表添加其他权限。从 UI 的角度来看,我认为在向用户分配权限时可能会很好,选择“角色”只需选中与该角色关联的相应框,然后自定义并提交。这样我想我可能只需要用户表和权限表之间的连接表吗?啊。这对于第一次使用数据库的设计师来说是相当令人生畏的哈哈。还记得你刚开始的时候吗?或者,也许你们比我更天才,哈哈。
架构图片链接(还不能发布图片)
这是一篇关于查询驱动数据库设计的简洁学术文章(尽管已有 10 年历史),标题为:“针对不同查询模式的稳健数据库设计”。结论部分有一个有趣的方法。