0

我必须以这种方式创建一个数据库来存储位置:

countries: id, name
regions: id, name, countries_id
municipality: id, name, regions_id

同一个数据库还有与这个地方相关的其他表。问题是并不总是知道市镇(最具体的位置值),有时我们只知道地区或国家。所以我们必须像这样创建其余的表:

user: id, name, municipality_id, regions_id, countries_id

由于关系中的重复,该方案存在问题。一个用户可以与一个地区和一个国家相关联,但是这个地区也与一个国家相关联。

处理这个问题的最佳方法是什么?一个可能的解决方案是这样的:

用户:id、姓名、place_table、place_id

但是这种方法不允许使用外键,查询起来有点困难。

4

1 回答 1

0

您不想在user表中存储三个字段。这引入了一致性问题。

一种解决方案是保留您当前的表结构并将城市表扩展为包括地区和国家。因此,每个地区和每个国家都将出现在表格中。“国家”自治市(比如法国)将指“法国”地区,进而指“法国”国家。

我首选的解决方案是只有一张桌子。这使结构非规范化。然而,假设是这种层次结构并没有真正改变太多(如果有的话)。取而代之的是三个表,有一个名为类似的表Places,其列如id, name, type, municipality_name, region_name, country_name

我意识到这与规范化数据库的“颗粒”背道而驰(尽管它对应于维度分析中的维度)。假设值不改变,对数据进行非规范化可能会产生最简单的数据结构和查询,而不会在维护数据时产生太多开销。

编辑:

我认为您的评论是用我上面提到的多个列来描述表格。如果您希望用户从此类表中选择一个县,请使用select distinct country_name from Places. 如果你想要一个国家的所有地区,那么 user select distinct region_name from Places where country_name = XXX

于 2013-09-07T14:06:45.660 回答