2

警告

我想添加一个免责声明来警告这个数据库结构。我强烈建议采用更精简的方法。

我个人的偏好是使用分层的一或二表结构来存储导航菜单。有关从平面结构建立菜单的指南,请参阅https://stackoverflow.com/a/444303/1778606

回答

就我而言,答案是在客户端缓存菜单。如果您愿意,请继续阅读。


我有一个使用多个查询生成的三层菜单。在我继承的应用程序中,有很多用户组。每个用户都可以通过用户组访问 Web 应用程序的不同页面/部分。单个用户可能在许多用户组中。

权限和可用菜单项

在他们的菜单中,每个用户应该只能看到和访问他们的组有权访问的页面。IE。每个用户只能看到某些菜单项、菜单子菜单部分和菜单子菜单部分项。数据透视表控制可见性和访问。

要生成菜单,我需要进行几个查询。我建议的菜单设计示例如下所示。

建议的菜单设计

根据用户可以访问的第 1 层、第 2 层或第 3 层项目,此菜单看起来完全不同。

在会话中为每个用户缓存整个菜单而不是为每个页面加载生成它是否合适?这可能会缓存很多数据吗?我主要担心的是它会为会话中的每个活动用户缓存所有三个表(Tier1、Tier2、Tier3)。无论如何,我都需要访问数据以查看用户是否具有权限,但是嗯!

是否有任何架构设计可以帮助减少生成菜单所需的查询数量?(假设菜单是在每个页面加载时生成的,就像我开始写这个问题时所假设的那样正常工作)

这种菜单在应用程序中是否正常 - 我们有 20 个组,用户分布在 2 到 20 个之间?欢迎任何建议或意见。

(我想尽量减少页面加载和处理时间。)

上下文:我正在使用 c#、asp.net mvc3、oracle。最大用户群估计约为 20,000。最大活跃用户群接近 1000。可能的活跃用户群为 100。

4

4 回答 4

2

首先当用户登录时,然后在缓存中加载登录用户下允许的菜单。然后从该用户的缓存中访问菜单/子菜单。当用户注销时清除缓存。在这种情况下,每次新用户登录时,只会为该用户加载缓存。

谢谢

于 2013-11-03T10:06:08.757 回答
1

您可以添加 app fabric 或 memcached 之类的东西,而不是使用 session 来缓存这些信息。

这样做的好处是不必在负载平衡的应用程序中处理会话。

空间应该不是什么大问题。

于 2013-11-03T05:54:31.527 回答
1

为每个用户加载一次整个菜单并将其缓存在客户端上。

除非它们使缓存无效(通过重新加载),否则不需要重新加载它。

仍然需要在每个页面上进行查询以验证用户是否具有权限。

(为我自己的问题回答尝试#2)

于 2013-11-03T06:50:51.883 回答
0

这是一个选项...

将Tier1、Tier2、Tier3数据表保存在应用数据缓存中

将 Tier1、Tier2、Tier3 表的主键存储在每个用户会话中的数组中,即。一个 Tier1Key、Tier2Key、Tier3Key int[]。

这应该会在一定程度上减少内存占用。仍然会产生一些负载。您可以通过对子菜单使用局部视图并将局部视图缓存在客户端上来解决此问题。(这将需要通过 ajax 延迟部分菜单加载,这将在 MenuItem 单击时发生)

您可能需要查询以验证对每个页面的访问。

对于客户端缓存,请参阅OutputCache Location=Client doesn't seem to work

(回答我自己的问题的尝试)

于 2013-11-03T06:25:40.010 回答