我有一个可由用户主持的文件夹实体。文件夹可以包含其他文件夹。所以我可能有这样的结构:
Folder 1
Folder 2
Folder 3
Folder 4
我必须决定如何为此实体实施审核。我想出了两个选择:
选项1
当用户被授予对文件夹 1 的审核权限时,在文件夹 1 和用户 1 之间定义审核者关系。不会将其他关系添加到 db。
为了确定用户是否可以审核文件夹 3,我检查并查看用户 1 是否是任何父文件夹的审核人。
这似乎减轻了在定义关系后在文件夹 1 下处理更新/移动实体/添加的一些复杂性,并且恢复关系意味着我只需要处理一个实体。
选项 2
当用户被授予对文件夹 1 的审核权限时,定义用户 1 和文件夹 1 之间的新关系,并在创建关系时定义所有子实体直至孙子的最大孙子实体,如果它被删除,则向下迭代图表以删除关系。如果我在建立这种关系后在文件夹 2 下添加一些东西,我只需将所有版主复制到新实体中。
但是,当我只需要显示用户正在审核的顶级文件夹时,我需要查询具有用户未审核的父文件夹的所有文件夹,而不是选项 1,我只查询用户正在审核。
想法
我认为这归结为确定用户是否会查询所有父项而不是查询子项......如果是这样,那么选项 1似乎更好。但我不确定。
任何一种方法都比另一种更好吗?为什么?还是有另一种比两者都更好的方法?我正在使用实体框架以防万一。
响应无液
在选项 1 中,删除具有主持人-用户关系的父文件夹时会发生什么情况?子文件夹是否向上移动一级?
从数据库中删除所有子项。
用户多久执行一次您需要确定他/她是否是该文件夹的模组的操作?选项 2 中创建的额外关系可能仅在有多个主持人和数千个子文件夹要计算以实现您想要的性能时才有用。
没有也不会有很多版主需要访问他们审阅的项目的子项 - 如果有,对“UserModeratesParentOfThisFolder()”的调用是验证工作流程中的最后一次检查,因此不会有其他用例受到影响结果(我认为)。
同样值得考虑的是,您可以执行选项 3:维护“子文件夹与主持的父文件夹”关系,而不是在选项 2 中沿树复制主持人-文件夹关系。这样,您可以在两个查询中验证用户是否具有 mod 访问权限 - 1) 对包含 child_folder_mod_parent 关系的表,然后 2) 检查用户是否是任何返回的父文件夹的 mod。因此,即使有多个 mod,您复制这种关系的次数也少于选项 2。
我不太明白这一点。这与选项 1 有何不同?
我确实发现选项 2 和 3 很乱,恕我直言。#2 没有 #3 那么混乱,如果你需要的是纯粹的性能(真的会有那么多的 mod 活动吗?)那么你的选项 2 就足够了。从“结构”的角度来看,选项 1 是最简洁的,但也有其性能缺陷。您应该看到选项 1 对性能的影响有多大,以及是否比您需要实施选项 2 来解决它。我假设您将在底层数据库中使用等效的存储过程类型来实现选项 1。通过重复来回 SQL 到应用程序代码调用来执行此操作将是一个更大的性能打击。
我不认为会有大量的 mod 活动,而且我已经实施了选项 1,所以我想我会试一试,如果性能成为问题,我会牢记选项 2。不过,我对第三个选项很好奇……任何进一步的细节都会很棒。感谢您的帮助 :)