我正在尝试为零售公司的位置创建基础是商店的位置的数据库结构,而区是一组由地理位置分组的商店,依此类推。从最大到最小的(区域明智(,它进行了:
区域 ->区域 ->区 ->商店
每个级别都有相同的基本列:
ID
Name
LeaderID
CreatedOn
UpdatedOn
Active
最好将每个级别的每个级别都放在自己的表格中,还是将其凝结到一个" parenterlocation"列的"位置"表中?因为上层次结构将需要多次加入层次结构以来,会有明显的性能吗?
您需要一个与父母关系的表格,只要您为联接字段创建适当的索引,性能就不会受到影响。
Area: { area_id (pk), area }
Region: { region_id (pk), area_id (fk), region }
District: { district_id (pk), region_id (fk), district }
然后,您的Store
表将有一个更具体的位置的引用。
Store: { store_id (pk), district_id (fk), <other store fields>}
如果您想从某些特定区域的商店加入所有表
SELECT S.*
FROM Stores S
JOIN District D ON S.distric_id = D.distric_id
JOIN Region R on D.region_id = R.region_id
JOIN Area A on R.area_id = A.area_id
WHERE A.area = 'some area'
编辑:也许我向后理解地理位置。对于我的例子,我认为区域是较大的几何形状,区域是较小的区域。
最好拥有一个位置表并具有父级位置列。
至于树的遍历,有很多方法可以处理不同的情况。基本答案将取决于您在表中拥有多少数据以及如何使用它。
您所拥有的一些不同的选项是:
- 创建一个路径索引(例如Areaid | regionid | district(
- 递归穿越树
- 自我加入
我确定还有其他,因为这不是一个完整的列表,但是您要做的就是创建一些测试指标,然后决定最适合您的问题。