【问题标题】:How to model geographical retail location hierarchy如何建模地理零售位置层次结构
【发布时间】:2017-10-04 09:43:13
【问题描述】:

我正在尝试为一家零售公司的位置创建数据库结构,其中基地是商店,一个地区是按地理位置分组的一组商店,依此类推。从最大到最小(按面积):

区域 -> 地区 -> 区 -> 商店

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

ID
Name
LeaderID
CreatedOn
UpdatedOn
Active

最好将这些级别中的每一个都放在自己的表中,还是将其压缩为一个带有“ParentLocation”列的“Locations”表?由于向上层级需要多次加入同一个表,会不会有明显的性能影响?

【问题讨论】:

    标签: sql-server database schema


    【解决方案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 是较小的几何图形。

    【讨论】:

      【解决方案2】:

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

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

      您可以使用的一些不同选项是:

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

      我相信还有其他的,因为这不是一个完整的列表,但您需要做的是创建一些测试指标,然后确定最适合您的问题的指标。

      【讨论】:

      • 喜欢 hierarchyid 这类东西。如果您想了解更多信息,请告诉我!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      相关资源
      最近更新 更多