sql - 如何将一行与同一个表中的其他几行关联起来?
问题描述
在我的情况下,我有一张邮政编码表。我希望每一行都有一个周围邮政编码的列表。
使用我正在开发的应用程序,我希望能够按邮政编码/郊区搜索并包括附近的邮政编码。说2英里以内。我知道如何识别郊区周围的邮政编码,但不知道如何关联这些,以便我可以在我的模型中检索周围郊区的邮政编码。
例如,在下面,邮政编码0001
可能被0003
, 和0004
id | postcodes
1 | 0001
2 | 0002
3 | 0003
4 | 0004
我非常不确定如何构建这个模型。我需要一个单独的表来将邮政编码与其邻居相关联吗?这可以在一张桌子内完成吗?
如果有帮助,我正在使用 Python SQLAlchemy ORM 运行 PostgreSQL。
谢谢你的帮助。很高兴回答任何有帮助的问题。
解决方案
这是一件棘手的事情,因为这本质上是“图形”数据,而且很难处理。几个问题:
那些“周边”代码是否可以根据表中的数据计算得出?还是表中需要设置的魔法知识?
添加行时是否有此问题,或者稍后会更新?
这会改变吗(最近?,经常?从来没有?)或者这是一个常量表?
您可以做的两件事是:1)使用此数据创建一个新表 2)创建一个新列,其中包含一个包含这些周围代码的数组。这甚至可以在 Postgress 中被有效地索引和搜索。
新表的缺点是它是一个新表。优点是您可以将列定义为外键,如果您删除,您可以利用这一点。
带有数组的列的优点是您不需要新表,但缺点是您不能将其定义为外键,因此如果删除任何代码,您将负责编写某种程序来清除这些代码数组。
这看起来像这样:
id | postcodes | adjecent
1 | 0001 | {0003, 0004, ...}
2 | 0002 | {...}
3 | 0003 | {0001, ...}
4 | 0004 | {0001, ...}
新表可以是一个简单的数据透视表:
id | adjecent
1 | 3
1 | 4
3 | 1
4 | 1
或更复杂的数组表:
id | adjecent
1 | {3, 4}
3 | {1}
4 | {1}
请记住,如果您使用数组,则您正在使用该外键信息。
推荐阅读
- c++ - 具有不同函数类型值的 std::map
- vagrant - 替代在 M1 Apple Silicon 上运行 Vagrant 和 VirtualBox
- collision - Unity - 分数保持在 1
- function - 使用带参数的函数,打印并修改以下消息,以便能够将名称 Python 更改为任何其他编程语言
- php - 在 Laravel 中使用 maatwebsite/excel 的未定义方法 'download'.intelephense(1013)
- javascript - 样式输入问题[type='range']
- python - 我可以允许用户输入我的 kivy 应用程序输出到的命令提示符窗口吗?
- maven - Nexus IQ 获取每个库的 EOS 详细信息
- python - 我正在尝试获得不同用户的回复
- mysql - 无法将 docker nginx 服务器连接到本地 mysql 数据库