【问题标题】:How to design a MySQL database for zipcode based service?如何为基于邮政编码的服务设计 MySQL 数据库?
【发布时间】:2011-05-27 07:27:08
【问题描述】:

我正在尝试设计一个 MySQL 数据库来存储用于提供特定服务的用户邮政编码首选项。例如,作为管道工的用户 A 愿意前往 x、y 和 z 邮政编码来提供他的服务。 我一直在思考实现这一点的各种方式,可扩展性非常重要。另外,我想在邮政编码和城市名称之间进行映射。

一种设计方法是创建一个巨大的表格,其中每一列代表一个邮政编码,每一行将存储一个带有邮政编码首选项的用户条目。但是当我添加邮政编码并说数百万用户时,这将如何扩展?我认为它不会很好地扩展,但实现起来很简单。

另一种方法是通过拥有一个主表和一堆辅助表来使这种层次结构。辅助表包含一个县的邮政编码,主表充当辅助表的键。我认为这会更好地扩展,因为表可以分布,但我可能有少量冗余,因为用户可以存储在多个表中。

无论如何,如果有任何想法、想法或替代设计可以帮助我解决这个问题,我将不胜感激。问题真的归结为,我应该如何设计这个以及为什么?

更新: 我有一个包含用户信息的单独表格。我正在尝试为用户的邮政编码首选项设计表格。

【问题讨论】:

  • 附带问题:邮政编码和城市名称之间不一定一一对应。沿着得克萨斯州边界,甚至可能还有一些邮政编码仍然映射到两个。邮政编码与邮递员的路线行驶方式有关,与地理或政治边界无关。
  • 小心这种方法。示例:我在城镇线附近。线路的另一端离我不到半英里有一家比萨店。没有人知道如何将我纳入他们的交付区域。

标签: mysql database database-design


【解决方案1】:

我建议对您当前的方法进行一些改进。

使用支持地理空间数据索引的数据库,例如PostgreSQL 与 Postgis。然后,除了邮政编码,还要存储邮政编码的坐标。

因此,当询问您的水管工他想要提供哪些邮政编码时,您将能够提取附近的邮政编码。同样,当用户查询您的数据库时,您将能够在附近地区调动管道工。

【讨论】:

  • MySQL 确实允许空间索引。但仅限于 MyISAM 表。
  • MyISAM 排除了它,不是吗? :-)
  • 不是真的,如果你不需要那个表上的事务。 MyISAM 很好,记住您仍然可以在所有其他表上使用事务引擎。和 OP 的表要求。看起来很静态,只是一个查找表,避免重复计算。
  • 我不知道。我用 MyISAM 得到的唯一东西就是损坏的表,我自己。但我认为许多其他人的里程数更好。
【解决方案2】:

您必须定义实体而不考虑可伸缩性问题,您一开始就不想犯数据库设计错误。 我猜您可能有两个表,例如 User 和 ZipCodes,以及一个将用户首选项与邮政编码相关联的表,例如 UserZipCodes,它将根据您的要求为用户提供一个或多个首选邮政编码(可能强制执行它具有唯一的约束)。我不知道 MySQL,但是在 SQL Server 中读取这样的表,只有很少的列,不是性能问题,所以你最好事先测试一下。

【讨论】:

    【解决方案3】:

    由于工匠通常不会走数百英里来修理漏水的水龙头,因此您可以按以下方式解决问题:

    我只需创建一个 zip_code_distances 表并预先计算美国所有 42K 邮政编码之间的距离,这些邮政编码彼此之间的半径在 20-25 英里范围内……仅包括 20-25 英里范围内的邮政编码彼此的半径将您需要存储在距离表中的行数从最大值 17 亿 (42K ^ 2) - 42K 减少到更易于管理的 400 万左右...

    在这里查看我的完整答案:

    Calculate distance between zip codes and users

    您要包括的其他表格包括:city、city_to_zipcode 等...

    希望对你有帮助:)

    【讨论】:

      【解决方案4】:

      我会使用 postgresql - 非常可扩展。它的功能也非常丰富。至于架构,请考虑将表拆分为三个表: 1. 邮政编码表 2. 用户数据表 3. 跨表链接邮政编码和数据

      不要在一张桌子上做!

      【讨论】:

        【解决方案5】:

        根据其他人的建议...三个实体:用户、邮政编码和两者之间的交叉引用。业务规则将是... 一个用户可以服务多个邮政编码。 一个邮政编码可以由多个用户提供服务。

        行数可能看起来很大,但实际上这对于现代 DBMS 来说并不多,而且有一些方法可以从具有数百万行的表中获得非常好的性能。例如。水平分区。

        还有一个不错的方法是存储地理空间数据,以帮助用户按照@Denis 的建议选择附近的邮政编码

        【讨论】:

          猜你喜欢
          • 2013-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多