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

时间:2010-08-12 19:54:31

标签: sql mysql

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

基本上我正在尝试构建的是一个“breadcrumbish”分类类型系统(如文件目录),其中每个节点都有一个父节点(root除外),每个节点可以包含数据或另一个节点。这将用于组织数据库中的电子邮件地址。我现在有一个系统,您可以在其中创建“组”并向该组添加电子邮件地址,但向组织系统添加组合系统会非常好。

这(在我的脑海中)是树形式,但我不知道是什么树。

我遇到的问题是使用MySQL构建它。遍历内存中的树很容易,但在数据库中,它有点棘手。


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


SELECT * FROM Business: Tim的五金店,7-11,Kwik-E-Mart,Cub Foods,Bob's Grocery Store,CONGLOM-O

SELECT * FROM Grocery Stores: Cub Foods,Bob's Grocery Store,CONGLOM-O

SELECT * FROM Big Grocery Stores: CONGLOM-O

SELECT * FROM Churches: 圣彼得教堂,圣约翰教堂


我认为这应该是足够的信息,所以我可以准确地描述我的目标。

4 个答案:

答案 0 :(得分:3)

嗯,您可以使用一些模式。哪一个是正确的取决于您的需求。

您需要选择一个节点及其所有子节点吗?如果是这样,那么Nested set Model (Scroll down to the heading)对您来说可能更好。该表如下所示:

| Name     | Left | Right |
| Emails   | 1    | 12    |
| Business | 2    | 7     |
| Tim's    | 3    | 4     |
| 7-11     | 5    | 6     |
| Churches | 8    | 11    |
| St. Pete | 9    | 10    |

那么,要找到节点下面的任何内容,只需执行

SELECT name FROM nodes WHERE Left > *yourleftnode* AND Right < *yourrightnode*

查找节点上方的所有内容:

SELECT name FROM nodes WHERE Left < *yourleftnode* AND Right > *yourrightnode*

如果您只想查询特定级别,可以执行Adjacency List Model (Scoll down to the heading)

| Id | Name     | Parent_Id |
| 1  | Email    | null      |
| 2  | Business | 1         |
| 3  | Tim's    | 2         |

要查找同一级别的所有内容,请执行以下操作:

SELECT name FROM nodes WHERE parent_id = *yourparentnode*

当然,没有什么可以阻止你做混合方法,它可以让你查询你想要的查询

| 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/ |

真的,这只是你需要的问题......

答案 1 :(得分:1)

最简单的方法就是这样:

Group
  - GroupID (PK)
  - ParentGroupID
  - GroupName

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

GroupMembership
  - GroupID (PK)
  - PersonID (PK)

这应该建立一个结构,您可以拥有包含父组的组和可以是组(或多个组)成员的组。如果一个人只能是一个群组的成员,那么请删除 GroupMembership 表,并在人员表上添加 GroupID

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

答案 2 :(得分:0)

与往常一样,当我看到有关树和层次结构建模的问题时,我的建议是,您可以获得Joe Celko's book on the subject的副本。他提出了各种方法来在RDBMS中对它们进行建模,其中一些方法具有相当的想象力,并且他给出了每种模式的优缺点。

答案 3 :(得分:0)

创建一个对象组,该组具有名称,许多电子邮件地址和父级,可以为空。