在关系数据库中存储文件夹层次结构

时间:2009-04-05 16:47:25

标签: sql sql-server-ce hierarchy directory relational

我有表示文件夹的对象,我想知道它们是否应该在数据库中表示。

一方面,似乎最简单的方法是不表示文件夹对象,只存储文件夹中包含的对象的路径值。我看到的问题是你不能保留一个后代不包含任何项目的文件夹,这不是什么大不了的事。此外,我还没有清楚地知道如何加载文件夹层次结构以显示(例如在TreeView中)而不将所有内容预先加载到内存中,这可能是性能问题。

另一种方法是使用一个“文件夹”表,其中包含对其父文件夹的引用。这似乎应该可行,但我不确定如何允许具有相同名称的文件夹,只要它们不共享父级。这应该是数据库应该关注的事情,还是我应该在业务逻辑中强制执行的事情?

4 个答案:

答案 0 :(得分:6)

这个想法是这样的(自我引用):

CREATE TABLE FileSystemObject ( 
    ID int not null primary key identity,
    Name varchar(100) not null,
    ParentID int null references FileSystemObject(ID),
    constraint uk_Path UNIQUE (Name, ParentID),
    IsFolder bit not null
)

答案 1 :(得分:1)

page的中间看一下ERD。将层次结构分解为单独的表允许您支持多种分类法。

答案 2 :(得分:0)

首先问问自己,保持数据库中的层次结构的目的是什么,以及您获得的功能。然后请考虑进行这项工作和维护。

如果您只是使用它来填充树形控件,则会有直接针对文件夹系统的内置控件。那对你有用吗?通过将其存储在数据库中,您获得了超越的东西吗?您打算如何使数据库与实际文件夹系统保持同步,可以在数据库外部进行更改?除非您提供虚拟文件系统,否则最好直接使用存储在数据库中的相关路径来对抗真实事物。

答案 3 :(得分:0)

SQL Server具有hierarchyid数据类型,支持分层结构。请注意,仅适用于完整版。