我想添加一个免责声明来警告这个数据库结构。我强烈建议采用更简化的方法。
我个人的偏好是使用分层的一个或两个表结构来存储导航菜单。有关从平面结构中竖立菜单的指导,请参阅https://stackoverflow.com/a/444303/1778606
就我而言,答案是将菜单缓存在客户端上。如果你愿意,请继续阅读。
我有一个使用多个查询生成的三层菜单。在我继承的应用程序中,有许多用户组。每个用户都可以通过用户组访问Web应用程序的不同页面/部分。单个用户可能在许多用户组中。
在他们的菜单中,每个用户应该只能查看和访问他们的群组有权访问的页面。即。每个用户只能看到某些菜单项,菜单子菜单部分和菜单子菜单部分项。数据透视表控制可见性和访问权限。
要生成菜单,我需要进行多次查询。我的样本菜单设计如下所示。
此菜单看起来截然不同,具体取决于用户有权访问的tier1,tier2或tier3项目。
是否适合在会话中为每个用户缓存整个菜单,而不是为每个页面加载生成它?这可能是要缓存大量数据吗?我主要担心的是它会为会话中的每个活动用户缓存所有三个表(Tier1,Tier2,Tier3)。无论如何我需要访问数据以查看用户是否具有权限,但是meh!
是否有任何架构设计有助于减少生成菜单所需的查询数量? (假设菜单是在每个页面加载时生成的,正如我在开始编写此问题时所假设的那样正常工作)
这种菜单在应用程序中是否正常 - 我们有20个组,用户在2到20之间?欢迎任何建议或意见。
(我想尽量减少页面加载和处理时间。)
上下文: 我正在使用c#,asp.net mvc3,oracle。最大用户群估计约为20,000。最大活跃用户群接近1000.可能活跃的用户群为100。
答案 0 :(得分:2)
首先,当用户登录时,然后在缓存中的登录用户下加载允许的菜单。然后从该用户的缓存中访问菜单/子菜单。当用户注销然后清除缓存。在这种情况下,每次新用户登录时,只会为该用户加载缓存。
谢谢
答案 1 :(得分:1)
您可以添加app fabric或memcached等内容,而不是使用会话来缓存此信息。
这样做的好处是不必在负载平衡的应用程序中处理会话。
空间应该不是问题。
答案 2 :(得分:0)
这是一个选择......
将Tier1,Tier2,Tier3数据表保留在应用程序数据缓存中
将Tier1,Tier2,Tier3表的主键存储在每个用户的会话数组中,即。一个Tier1Key,Tier2Key,Tier3Key int []。
这应该会减少内存占用。仍然会有一点负载生成。您可以通过使用子菜单的部分视图并在客户端上缓存局部视图来解决此问题。 (这将需要通过ajax延迟部分菜单加载,这将在MenuItem点击时发生)
您可能需要查询来验证每个页面的访问权限。
用于客户端缓存,请参阅OutputCache Location=Client does not appear to work,
(对我自己的问题的回答)
答案 3 :(得分:0)
为每个用户加载整个菜单一次,并将其缓存在客户端上。
除非它们使缓存无效(通过重新加载),否则不需要重新加载。
每个页面仍然需要进行查询以验证用户是否具有权限。
(针对我自己的问题,尝试回答#2)