【发布时间】:2011-04-18 17:08:51
【问题描述】:
我正在 Sql Server 中为 C# Asp.Net MVC3 网站实现内容数据库。
表结构基本上是一个邻接列表,但我的文件和文件夹被划分为FileSystems,以便我可以隔离各个用户/帐户的内容:
FileSystem:
[ID]
Folder:
[ID]
[FileSystemID]
[ParentFolderID] (null)
[Name]
File:
[ID]
[FileSystemID]
[ParentFolderID]
[Name]
[Content]
考虑到这里的低效标准化,这是非常基本的东西。
如果适用,我还有[Created] 和[Modified] 的列。
这些文件将用于在 Asp.Net MVC 3 站点中执行页面的动态品牌化,其中每个请求都将寻找基于原始 Asp.Net 的更具体的品牌化版本的 css/图像文件MVC 内容网址 - 例如"~/Content/Site.css" 可能会变成 "~/[dynamic content root]/[accountid]/[theme]/Site.css"。
这个基本机制已经全部起作用了;我主要关心的是缓存和版本控制。
显然,与其一直在数据库中搜索相同的文件和文件夹,不如构建内容文件系统的内存缓存以加快内容查找和交付速度。但是,我需要一种有效的方法来确保网络场中的所有网络服务器都检测到帐户虚拟文件系统中的更改(任何文件或文件夹更改/删除/创建),以确保主题更改立即反映在所有服务器上,例如下一个请求。
由于分层查询可能很昂贵,因此我不考虑每次对文件系统中的所有创建/上次修改日期运行健全性检查。然而,我考虑的是整个文件系统上的级联版本号。
因此,文件系统中的任何 更改都会导致文件系统本身的版本号增加,并且可能会导致更改项之后的所有父文件夹增加。因此,阅读器可以简单地附加到整个文件系统或其中的特定部分,并每次运行廉价查询来检查当前版本与缓存版本。
这确实有减慢更新速度的缺点,但我希望文件系统不会经常更改,而会非常频繁地读取它。我对这种方法唯一关心的是更新的并发性,以及如何管理它。
这是一个好方法吗?有什么更好的我可以考虑的吗?
欢迎任何想法!
【问题讨论】:
标签: c# sql asp.net-mvc