邮政编码/城市多对多桥接表的最佳设计

Posted

技术标签:

【中文标题】邮政编码/城市多对多桥接表的最佳设计【英文标题】:Best design for a zip code/city many-to-many bridge table 【发布时间】:2013-10-29 21:19:02 【问题描述】:

我正在尝试一些想法来构建一个邮政编码/城市名称表,我只会以一种方式使用它 - 给定邮政编码,返回主要城市名称(这是最常见的方式已使用),或返回该 zip 的所有有效城市名称的列表。我的两个想法是

1) 制作一个 3 列的表格 - zip、cityName 和 primary。其中“主要”列只是一个布尔值,用于标记该行中的城市是否是该邮政编码的主要城市名称。

2) 两列表格,但邮政编码列将是唯一的。主要城市行有一个常规的“12345”拉链,备用城市名称有一个“12345-1”、“12345-2”等。我在想这会让获取主要城市名称更容易,我可以在需要时执行 LIKE "12345%" 来检索所有城市名称。

由于我是数据库设计的新手,我想你们中的某个人可能对哪个更好,或者是否有更好的第三种选择有一些见解。

【问题讨论】:

【参考方案1】:

我不推荐选项 2。在某些方面,您是在“设计”您的数据以适应您的架构,而不是相反。

选项 1 肯定是可行的,如果您给出了所有用例,我看不出有任何真正的缺点。只需确保添加正确的键、索引和约束即可。我可以看到你至少需要这些:

主键:Zi​​p、CityName(每一行由 Zip/City 组合唯一确定) 索引:Primary(能够找到所有主要城市) 限制:每个 zip 只能有一个主要城市

【讨论】:

谢谢。我的另一个想法是将它与我​​的 lat/long 表合并。我有一个带有 zipID/Lat/Long 列的单独表格。如果我使用选项 1,删除“主要”列并添加“纬度”和“经度”,但只包括主要城市名称行上的数据,这些列在备用城市行上将为空。 嗯,你为什么不在非主要城市包括纬度/经度?似乎是一个有用的数据,更重要的是,您将回到“设计数据而不是模式”。在我看来,使用纬度/经度作为主要城市的指示并不是一个好的设计。 我绝对明白你来自哪里。纬度/经度仅用于给定邮政编码的半径检查,因此它实际上不会与城市名称一起使用。备用城市名称仅用于限制数据库中的新地址(城市名称必须与该邮政编码相关联)。 不过,我绝对建议将它们分开,并将主要标志放在桌子上。

以上是关于邮政编码/城市多对多桥接表的最佳设计的主要内容,如果未能解决你的问题,请参考以下文章

从多对多关系的桥接表中检索数据的查询[关闭]

多维数据集设计 - 带有附加列的多对多映射的桥接表

hibernate关联关系(多对多)

多对多表的设计小案例

Firebase简单多对多关系

RESTful API 设计更新 1/多对多关系的最佳实践?