表结构基本上是一种相邻列表,但我的文件和文件夹被分成了“FileSystem”,以便我可以隔离单个用户/账户的内容。
FileSystem:
[ID]
Folder:
[ID]
[FileSystemID]
[ParentFolderID] (null)
[Name]
File:
[ID]
[FileSystemID]
[ParentFolderID]
[Name]
[Content]
尽管在此进行非高效的规范化,但这是非常基本的东西。
我还有与[Created]
和[Modified]
相关的列。
这些文件将用于在Asp.Net MVC 3网站中执行页面动态品牌,其中每个请求都会寻找更具体的基于原始Asp.Net MVC内容URL的品牌版本的css/image文件 - 例如:"~/Content/Site.css"
可能变成"~/[dynamic content root]/[accountid]/[theme]/Site.css"
。
这个基本机制已经完成了;我的主要关注点是缓存和版本控制。
显然,为了不必一直在数据库中探测相同的文件和文件夹,构建一个内存缓存来加速内容查找和交付是有意义的。然而,我需要一种有效的方式来确保Web农场中的所有Web服务器检测到帐户的虚拟文件系统(任何更改/删除/创建的文件或文件夹),以确保主题更改立即反映在所有服务器上,对于下一个请求。
由于分层查询可能很昂贵,因此我已经放弃了每次对文件系统中所有创建/最后修改日期进行健全性检查的方法。然而,我考虑过对整个文件系统进行级联版本号。
因此,文件系统中的任何更改都会导致文件系统本身的版本号增加,以及可能从更改项向上的所有父文件夹。因此,读者可以简单地附加到整个文件系统或特定部分,并每次运行廉价查询以检查当前版本与缓存版本是否相同。
这样做的缺点是会减缓更新速度,但我预计文件系统变化不频繁,而读取非常频繁。我唯一担心的是这种方法的并发性以及如何管理它。
这是一个好方法吗?还有什么更好的选择吗?
欢迎任何想法!