2017-05-05 35 views
0

我试图创建基地是商店的零售公司的位置的数据库结构,并且地区是按地理位置分组的商店组等等。从最大到最小(区明智)有云:如何建模地理零售地点层次结构

区 - >区域 - >区 - >存储

每个级别都有相同的基本列:

ID 
Name 
LeaderID 
CreatedOn 
UpdatedOn 
Active 

是更好地让每个这些级别在他们自己的表格中,还是通过“ParentLocation”列将其缩减为一个“Locations”表格?由于上层架构需要多次加入同一个表,会不会有明显的性能下降?

回答

1

只要您为连接字段创建适当的索引,性能就不会受到影响,您需要一个具有父级子关系的级别表。

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' 

编辑:也许我理解的地理倒退。对于我的例子,我假设Area是更大的几何体,而District是更小的几何体。

1

最好有一个位置表,并有一个父位置列。

至于树的遍历,有很多方法可以处理不同的场景。基本的答案将取决于你在表中有多少数据以及你如何使用它。

一些,你有与此不同的选项:

  1. 创建路径索引(例如areaID表示| RegionId |区)
  2. 递归遍历树
  3. 自加入

我确定还有其他人,因为这不是一个完整的列表,但您将不得不做的是创建一些测试指标,然后决定什么是最适合您的问题。

+0

我*爱* hierarchyid这种东西。让我知道如果你想知道更多! –