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

Posted

技术标签:

【中文标题】在关系数据库中存储文件夹层次结构【英文标题】:Storing folder hierarchy in relational database 【发布时间】:2009-04-05 16:47:24 【问题描述】:

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

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

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

【问题讨论】:

使用 SQL Server 2008 中的新 HIERARCHYID(在 DB 端)很容易实现 嗯,在 SQLCE 中可用吗? @Davy8,在除 SQL CE 之外的所有版本(包括 express)中。 +1 好问题。使用 SQL 数据库的好处 - 存储/处理层次结构的性能方面。 【参考方案1】:

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

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
)

【讨论】:

唯一键 :),不是必须的,它只是约束名称的一部分。 很酷,谢谢 :) 我知道这只是名称的一部分,但我不知道最常见的 sql 命名约定前缀,因为大多数 OO 世界倾向于回避匈牙利表示法,这在关系世界【参考方案2】:

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

【讨论】:

链接好像坏了。【参考方案3】:

首先问问自己,将层次结构保留在数据库中的目的是什么,以及从中获得什么功能。然后要求考虑这样做的工作和维护。

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于在关系数据库中存储文件夹层次结构的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习绪论

c数据结构 绪论 上

关系数据库模型的存储结构采用啥形式

数据库系统-关系模式

SQL Server 使用 Hierarchyid 操作层次结构数据

数据结构基本概念