在MySQL中建模变深度继承

时间:2012-01-25 20:12:04

标签: mysql sql inheritance

我正在开发一个项目,我需要在可变深度继承数据,然后能够返回特定数据片段的任何后代。我正在与地理区域合作,因此我正在考虑拥有一个“地区”表,并拥有从“北美”到个人社区的所有内容,例如“布朗克斯”。所以,如果有人输入“北美”,他们也应该收到“布朗克斯”的结果,因为“布朗克斯”是“北美”的后代通过这种关系 North America->United States->New York(State)->New York(City)->Bronx

在我的数据库中,我计划将Region表链接返回给自己,并使用一个表来指定Regions之间的父/子关系。这是我建议的一个例子: enter image description here

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

你不需要新桌子吗?主表中的外键就足够了。

这是我的方法:

第一个问题,设计数据架构:我将层次结构保留为父行的外键。这很简单。你有一个example with hiererchy regions here

WOE_ID  ISO Name    Language    PlaceType   Parent_ID
20069843    "NA"    "Oshana"    ENG State   23424987
55921113    "NA"    "Ondangwa"  ENG County  20069843
...

第二个问题,检索后代/后代:正如您所解释的那样,问题来自于:选择一些区域和所有后代的后代。要解决此问题,您应该创建一个新的树表。此表包含对:与具有所有祖先(及其自身)的人的组合:

region( id, name, id_parent)
region_tree( id, id_ancestor, distance )

注意到使用此结构很容易查询层次结构。示例:某些地区的所有后代:

select region.*, distance
from 
  region p
    inner join 
  region_tree t 
    on ( p.id = t.id)
where
  id_ancesor = **someregion.id **

您可以使用距离来获取子区域,子子区域......

最后一个问题,保持树:树必须始终是数据。您应该自动执行此操作:触发region或CRUD操作的存储过程