在MySQL

时间:2017-01-14 18:20:47

标签: mysql

我有一个由美国邮政编码组织的信息数据库。我正在构建沿着相邻邮政编码爬行的算法,以根据密度,工作特征等确定“城市”的大小。我使用任何邮政编码的位置和区域来估计与其相邻的其他邮政编码。我开始意识到当我运行程序测试时,这个算法占用了大部分处理时间。

所以我想要做的是在我的数据库的表中使用相邻zipcodes的地图(如在数据结构图中)。

我目前的实现是我有一个包含两个字段的表,source和target。每次我的算法确定两个zipcodes相邻时,两个代码都插入到表中,如下所示:

+-----------+------------+  
| source    |  target    |
+-----------+------------+
| 02139     |  02138     |
| 02138     |  02139     |
+-----------+------------+

这样我可以用

搜索所有相邻的邮政编码
SELECT target FROM adjacent WHERE source = '02139';

并获取与'02139'相邻的所有邮政编码。

现在严格来说,我的实施很好。对于一组总数少于50,000的邮政编码,按照我的方式进行,并没有真正施加任何计算惩罚。然而,没有被索引,并且每次插入两次关系似乎都不是最佳的,因为我只是为了玩游戏和学习,我应该努力进行优化。所以我试图找出如何使用mysql表更有效地模拟映射。

所以问题是:使用MySQL表示1对n映射的最有效方法是什么?

1 个答案:

答案 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更复杂。

我想这次讨论的目的是探索不同的 在承诺之前设计选项。所以就是这样。