Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 简单的用户权限数据库结构_Database_Database Design - Fatal编程技术网

Database 简单的用户权限数据库结构

Database 简单的用户权限数据库结构,database,database-design,Database,Database Design,我正在寻找关于用户权限的数据库结构的正确解决方案 表: 用户 公司(相关列:id) 项目(相关列:id,公司id) jobs(相关列:id,公司id,项目id) 我想要完成的场景是将特定用户和/或用户分配给: 公司内的所有项目(“Cindy被分配到公司内的所有项目和所有工作”) 选择公司内的项目(“Cindy被分配到五个项目中的三个,并被分配到这三个项目中的所有工作”) 项目中的选定工作(“Cindy在一个项目中被分配到十个工作中的五个,在另一个项目中分配到两个工作”) 我考虑使用单独的

我正在寻找关于用户权限的数据库结构的正确解决方案

表:

  • 用户
  • 公司
    (相关列:
    id
  • 项目
    (相关列:
    id
    公司id
  • jobs
    (相关列:
    id
    公司id
    项目id
我想要完成的场景是将特定用户和/或用户分配给:

  • 公司内的所有项目(“Cindy被分配到公司内的所有项目和所有工作”)
  • 选择公司内的项目(“Cindy被分配到五个项目中的三个,并被分配到这三个项目中的所有工作”)
  • 项目中的选定工作(“Cindy在一个项目中被分配到十个工作中的五个,在另一个项目中分配到两个工作”)
我考虑使用单独的
permissions
表,其中我只插入相关作业的权限,并使用
jobs
表中的相关列向上级联权限。换句话说,如果用户拥有特定作业的权限,那么它也拥有父项目和父公司的权限


SQL FIDLE:

这里是一个建议的
权限表结构

USER_ID     OBJ_TYPE      OBJ_ID     PERMISSION
JDOE        COMPANY       1          1-READONLY
JDOE        COMPANY       2          2-READWRITE
JDOE        PROJECT       1          2-READWRITE
然后,检查用户访问权限的代码可能如下所示:

SELECT MAX(permission) FROM permissions 
 WHERE user_id = :USERID
   AND (  (obj_type = 'JOB' and obj_id = :JOBID)
       OR (obj_type = 'PROJECT' and obj_id = :PROJECTID)
       OR (obj_type = 'COMPANY' and obj_id = :COMPANYID)) 

下面是建议的
权限的表结构

USER_ID     OBJ_TYPE      OBJ_ID     PERMISSION
JDOE        COMPANY       1          1-READONLY
JDOE        COMPANY       2          2-READWRITE
JDOE        PROJECT       1          2-READWRITE
然后,检查用户访问权限的代码可能如下所示:

SELECT MAX(permission) FROM permissions 
 WHERE user_id = :USERID
   AND (  (obj_type = 'JOB' and obj_id = :JOBID)
       OR (obj_type = 'PROJECT' and obj_id = :PROJECTID)
       OR (obj_type = 'COMPANY' and obj_id = :COMPANYID)) 

您的数据库是否能够使用用户角色?这些将对完成这项任务有很大帮助。我正在使用MariaDB,所以是的。当我想管理web应用程序用户访问应用程序内部特定位置时,是否应该使用数据库的
角色
功能?我不是说让任何人直接访问数据库,只是为了以防万一,我听起来像是想这样。这就是角色的目的!您可以在角色中嵌套角色(以便实现公司/项目/工作结构的镜像)。即使您不允许用户直接访问数据库,也可以使用数据库的角色来管理权限。否则,可以说,你最终会重新发明轮子。注意,这意味着为用户创建数据库用户帐户,而不是使用“用户”表。如果这是不可接受的,那么您必须返回权限表。在任何情况下,我都不会特别推荐名为“users”的数据库表,因为我把它与数据库的内部用户元数据表混淆了。现在迁移所有内容都太麻烦了,但在将来有更多时间优化数据库结构时,我会记住这一点。现在,虽然我需要坚持使用单独的
用户表,因为我们已经有很多东西了,并且考虑到我们想要添加社会认证,我会通过(至少现在是这样!)。谢谢你的链接-我将深入探讨它,只是为了扩大我的知识面。你的数据库是否有能力使用用户角色?这些将对完成这项任务有很大帮助。我正在使用MariaDB,所以是的。当我想管理web应用程序用户访问应用程序内部特定位置时,是否应该使用数据库的
角色
功能?我不是说让任何人直接访问数据库,只是为了以防万一,我听起来像是想这样。这就是角色的目的!您可以在角色中嵌套角色(以便实现公司/项目/工作结构的镜像)。即使您不允许用户直接访问数据库,也可以使用数据库的角色来管理权限。否则,可以说,你最终会重新发明轮子。注意,这意味着为用户创建数据库用户帐户,而不是使用“用户”表。如果这是不可接受的,那么您必须返回权限表。在任何情况下,我都不会特别推荐名为“users”的数据库表,因为我把它与数据库的内部用户元数据表混淆了。现在迁移所有内容都太麻烦了,但在将来有更多时间优化数据库结构时,我会记住这一点。现在,虽然我需要坚持使用单独的
用户表,因为我们已经有很多东西了,并且考虑到我们想要添加社会认证,我会通过(至少现在是这样!)。谢谢你的链接,我将深入研究它,只是为了扩大我的知识面。我用相关的SQL FIDLE更新了我的答案,以阐明我的想法。尽管如此,您的答案似乎可以使用类似的逻辑在后端进行循环。我使用相关的SQL FIDLE更新了我的答案,以进一步阐明我的想法。尽管如此,您的答案似乎可以使用类似的逻辑在后端进行循环。