标题可能是奇怪的,但可能是因为我甚至不知道我问的问题是否正确。
因此,从本质上讲,我要构建的是一个“面包屑”分类类型系统(如文件目录),其中每个节点都有一个父节点(除了根),每个节点可以包含数据或另一个节点。这将用于在数据库中组织电子邮件地址。我现在有一个系统,您可以在其中创建一个“组”并向该组添加电子邮件地址,但是向该组添加一个组织系统将是非常好的。
这个(在我脑子里)是一种树的格式,但我不知道是哪棵树。
我遇到的问题是使用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 *来自教堂:圣彼得教堂,圣约翰教堂
我认为这应该是足够的信息,这样我才能准确地描述我的目标是什么。
发布于 2010-08-12 20:11:45
嗯,有几种模式你可以用。哪一个是对的取决于你的需要。
您需要选择一个节点及其所有子节点吗?如果是这样的话,那么嵌套集模型(滚动到标题)可能更适合您。这张桌子看起来是这样的:
| 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*
如果只想查询特定级别,则可以执行邻接列表模型(Scoll向下到标题)。
| 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/ |
真的,这只是你的需要.
发布于 2010-08-12 20:09:40
最简单的方法是这样做:
Group
- GroupID (PK)
- ParentGroupID
- GroupName
People
- PersonID (PK)
- EmailAddress
- FirstName
- LastName
GroupMembership
- GroupID (PK)
- PersonID (PK)
这应该建立一个结构,其中可以有具有父组的组和可以是组(或多个组)成员的人员。如果一个人只能是一个组的成员,那么就去掉GroupMembership表,将一个GroupID放在People表中即可。
但是,针对这种结构的复杂查询可能会变得困难。还有其他一些不那么直观的方法来对此进行建模,使得查询变得更容易(但通常会使更新变得更加困难)。如果组数较少,则处理对此的查询的最简单方法通常是将整个组树加载到内存中,缓存它,并使用它构建查询。
发布于 2010-08-12 20:06:31
与往常一样,当我看到有关树和层次结构建模的问题时,我的建议是您获得一个乔·塞尔科关于这一主题的书的副本。他给出了在RDBMS中对它们建模的各种方法,其中有些方法相当富有想象力,并给出了每种模式的优缺点。
https://stackoverflow.com/questions/3471514
复制相似问题