首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该使用什么类型的数据结构来模拟一个文件系统?

我应该使用什么类型的数据结构来模拟一个文件系统?
EN

Stack Overflow用户
提问于 2010-08-12 19:54:30
回答 4查看 378关注 0票数 5

标题可能是奇怪的,但可能是因为我甚至不知道我问的问题是否正确。

因此,从本质上讲,我要构建的是一个“面包屑”分类类型系统(如文件目录),其中每个节点都有一个父节点(除了根),每个节点可以包含数据或另一个节点。这将用于在数据库中组织电子邮件地址。我现在有一个系统,您可以在其中创建一个“组”并向该组添加电子邮件地址,但是向该组添加一个组织系统将是非常好的。

这个(在我脑子里)是一种树的格式,但我不知道是哪棵树。

我遇到的问题是使用MySQL构建它。遍历内存中的树很容易,但在数据库中,则要复杂一些。

树木图像:http://j.imagehost.org/0917/asdf.png

SELECT *来自企业:提姆五金店,7-11,Kwik,Cub Foods,Bob's Grocery Store,CONGLOM

SELECT *来自格罗西商店:幼童食品,鲍勃的Grocery商店,CONGLOM O

来自大格罗西商店的SELECT *:CONGLOM

SELECT *来自教堂:圣彼得教堂,圣约翰教堂

我认为这应该是足够的信息,这样我才能准确地描述我的目标是什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-12 20:11:45

嗯,有几种模式你可以用。哪一个是对的取决于你的需要。

您需要选择一个节点及其所有子节点吗?如果是这样的话,那么嵌套集模型(滚动到标题)可能更适合您。这张桌子看起来是这样的:

代码语言:javascript
运行
复制
| Name     | Left | Right |
| Emails   | 1    | 12    |
| Business | 2    | 7     |
| Tim's    | 3    | 4     |
| 7-11     | 5    | 6     |
| Churches | 8    | 11    |
| St. Pete | 9    | 10    |

因此,要找到节点下面的任何内容,只需执行以下操作

代码语言:javascript
运行
复制
SELECT name FROM nodes WHERE Left > *yourleftnode* AND Right < *yourrightnode*

若要查找节点上方的所有内容,请执行以下操作:

代码语言:javascript
运行
复制
SELECT name FROM nodes WHERE Left < *yourleftnode* AND Right > *yourrightnode*

如果只想查询特定级别,则可以执行邻接列表模型(Scoll向下到标题)

代码语言:javascript
运行
复制
| Id | Name     | Parent_Id |
| 1  | Email    | null      |
| 2  | Business | 1         |
| 3  | Tim's    | 2         |

要找到同一层次上的所有东西,只需做:

代码语言:javascript
运行
复制
SELECT name FROM nodes WHERE parent_id = *yourparentnode*

当然,没有什么可以阻止您执行一种混合方法,它将允许您对手头的查询进行查询。

代码语言:javascript
运行
复制
| Id | Name     | Parent_Id | Left | Right | Path             |
| 1  | Email    | null      | 1    | 6     | /                |
| 2  | Business | 1         | 2    | 5     | /Email/          |
| 3  | Tim's    | 2         | 3    | 4     | /Email/Business/ |

真的,这只是你的需要.

票数 3
EN

Stack Overflow用户

发布于 2010-08-12 20:09:40

最简单的方法是这样做:

代码语言:javascript
运行
复制
Group
  - GroupID (PK)
  - ParentGroupID
  - GroupName

People
  - PersonID (PK)
  - EmailAddress
  - FirstName
  - LastName

GroupMembership
  - GroupID (PK)
  - PersonID (PK)

这应该建立一个结构,其中可以有具有父组的组和可以是组(或多个组)成员的人员。如果一个人只能是一个组的成员,那么就去掉GroupMembership表,将一个GroupID放在People表中即可。

但是,针对这种结构的复杂查询可能会变得困难。还有其他一些不那么直观的方法来对此进行建模,使得查询变得更容易(但通常会使更新变得更加困难)。如果组数较少,则处理对此的查询的最简单方法通常是将整个组树加载到内存中,缓存它,并使用它构建查询。

票数 1
EN

Stack Overflow用户

发布于 2010-08-12 20:06:31

与往常一样,当我看到有关树和层次结构建模的问题时,我的建议是您获得一个乔·塞尔科关于这一主题的书的副本。他给出了在RDBMS中对它们建模的各种方法,其中有些方法相当富有想象力,并给出了每种模式的优缺点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3471514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档