我目前有一个包含数据元素的树结构;在每一个上,都可以执行基本的CRUD操作。从这里开始,我需要为这四个操作中的每一个实现每个用户的权限。因此,可以为给定的用户提供“创建”和“读取”权限,但是没有“更新”或“删除”权限。然后,这些权限将把树向下层叠到允许对象的任何子级。因此,该给定的用户将具有针对根对象的所有子对象的Create和Read权限。
使用SQL(专用于MySQL和PHP)数据库存储这些权限的最佳方法是什么?当前,我在想理想的解决方案可能是创建另一个数据库表,该数据库表跟踪一个用户ID,一个对象ID,然后是一个跟踪每个可能的权限的布尔值列表,然后对照该权限表检查该用户ID和对象ID,并在树上向上行驶,直到找到(或视情况而定)许可对象为止。
我的主要问题是双重的。首先,它使得不可能授予一个对象,但不允许其子对象。其次,它似乎可能对特别深的物体造成性能下降。那么,看来这是个好方法吗?
递归数据结构通常很难“映射”到SQL查询。一些数据库对此有特殊的支持(例如,Oracle),但是MySQL没有内置的支持(=您可以解决该问题,但是它很笨拙)。
我们的应用程序需要类似的东西。我们的解决方案是在一个简单的表中存储规范化的数据(即“用户X在节点Z上具有权限Y”->具有FK关系的三列)。
DAO /管理器对象读取此表并建立一个缓存,在其中可以根据需要快速查找权限。
总结:使数据库保持简单,并在应用程序中编写特殊的帮助程序代码,以将数据库转换为所需的结构。