我有一个由美国邮政编码组织的信息数据库。我正在构建沿着相邻邮政编码爬行的算法,以根据密度,工作特征等确定“城市”的大小。我使用任何邮政编码的位置和区域来估计与其相邻的其他邮政编码。我开始意识到当我运行程序测试时,这个算法占用了大部分处理时间。
所以我想要做的是在我的数据库的表中使用相邻zipcodes的地图(如在数据结构图中)。
我目前的实现是我有一个包含两个字段的表,source和target。每次我的算法确定两个zipcodes相邻时,两个代码都插入到表中,如下所示:
+-----------+------------+
| source | target |
+-----------+------------+
| 02139 | 02138 |
| 02138 | 02139 |
+-----------+------------+
这样我可以用
搜索所有相邻的邮政编码SELECT target FROM adjacent WHERE source = '02139';
并获取与'02139'相邻的所有邮政编码。
现在严格来说,我的实施很好。对于一组总数少于50,000的邮政编码,按照我的方式进行,并没有真正施加任何计算惩罚。然而,没有被索引,并且每次插入两次关系似乎都不是最佳的,因为我只是为了玩游戏和学习,我应该努力进行优化。所以我试图找出如何使用mysql表更有效地模拟映射。
所以问题是:使用MySQL表示1对n映射的最有效方法是什么?
答案 0 :(得分:3)
在您的应用程序中, adjacency 的概念似乎是双向(又名对称)。也就是说,
A adj B if and only if B adj A
所以你可以考虑"规范化"该关系然后始终在第一列中存储具有较小数值的zip,在第二列中存储具有较大数值的zip。也就是说,使用您的示例,您现在只有一行:
+-----------+------------+
| zipLower | zipHigher |
+-----------+------------+
| 02138 | 02139 |
+-----------+------------+
然后当你需要找到所有相邻的拉链时,比如02139
,你的
查询可能看起来像这样(假设新表名为adjHigher
):
SELECT zipHigher as zip
FROM adjHigher
WHERE zipLower = '02139'
union
SELECT zipLower as zip
FROM adjHigher
WHERE zipHigher = '02139'
利弊
这真的是一个更优化的设计吗?这取决于。这个设计
使用一半的存储空间,并插入表中
效率更高(每个相邻关系只有一行,而不是两行)
需要插入)。但是,您也可以看到查找
查询变得更加复杂。如果你必须JOIN
这个
与其他表格相同的表格,此设计可能会使您的JOIN
更复杂。
我想这次讨论的目的是探索不同的 在承诺之前设计选项。所以就是这样。