2017-05-05 40 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這種東西。讓我知道如果你想知道更多! –