【问题标题】:How can I relate a row with several other rows in the same table? [closed]如何将一行与同一个表中的其他几行关联起来? [关闭]
【发布时间】:2020-09-11 03:03:51
【问题描述】:

在我的情况下,我有一张邮政编码表。我希望每一行都有一个周围邮政编码的列表。

使用我正在开发的应用程序,我希望能够按邮政编码/郊区进行搜索,并包括附近的邮政编码。说2英里以内。我知道如何识别郊区周围的邮政编码,但不知道如何关联这些以便我可以在我的模型中检索周围郊区的邮政编码。

例如在下面,邮政编码0001 可能被00030004 包围

id | postcodes         
1  | 0001          
2  | 0002
3  | 0003
4  | 0004

我非常不确定如何构建这个模型。我需要一个单独的表格来将邮政编码与其邻居相关联吗?这可以在一张桌子内完成吗?

如果有帮助,我正在使用 Python SQLAlchemy ORM 运行 PostgreSQL。

感谢您的帮助。很高兴回答任何有帮助的问题。

【问题讨论】:

标签: sql postgresql sqlalchemy


【解决方案1】:

这是一件棘手的事情,因为这本质上是“图表”数据,而且很难处理。几个问题:

这些“周边”代码是否可以根据表中的数据计算得出?还是表中需要设置的魔法知识?

添加行的时候有这个还是后面会更新?

这会改变(真的吗?,经常?从不?)还是这是一个常量表?

您可以做的两件事是: 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}

请记住,如果您使用数组,您将使用该外键信息。

【讨论】:

  • 谢谢多米尼克。我确实考虑了你提出的几个观点。我希望避免使用新表,因为这会像您所说的那样有效地重用数据,但如果这最终成为唯一或最好的方法,那就是这样。周边郊区不是我自己计算的。如果您会在原始帖子下看到我的评论,我正在使用识别附近郊区的 API。理论上,这些附近的郊区永远不会改变。它们应该是静态的。
  • 如果数据是静态的,最高效的方法就是预先计算它。如果您从不过滤或订购周围的代码,我会使用一个包含数组的新列。即使您过滤 GIST 或 GIN(抱歉,我不记得这两者中的哪一个)应该会给您带来很多里程数。要返回结果,您始终可以取消嵌套数组并获得“正常”结果。
  • 虽然可能不是最干净的,但我认为根据您的输入,单独的表格可能是最好的。
  • 这真的取决于你的目标。最干净的解决方案并不总是最高效的。我不知道这些数据会有多大,但如果变得非常大,如果你使用表或列,性能可能会有很大差异。考虑一下:如果你做一个新表,你需要去磁盘两次来构建一行。一次获取代码,一次获取相邻的 ID。用一个列你去光盘一次。但是,如果您仅在一小部分查询中需要此邻接数据,则列可能会更糟,因为每个查询都会从磁盘中读取此数据,因为它是行的一部分。
猜你喜欢
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多