我想知道什么是正确的方法。
我们的区域可以是northamerica
,southamerica
我们的帖子可以是slc
,murry
,peru
,mexico
因此,一个区域可以有许多地理位置。
这个表是
ID Area Geolocation
1 NA slc
2 NA murry
3 SA peru
4 SA mexico
如果区域和地理位置的数量非常有限并且预计不会增长,那么您会发现此类设计与使用FK的表格存在问题,如下所示
区域表
ID Area
1 NA
2 SA
地理位置表
ID Geolocation AreaID
1 slc 1
2 mexico 2
3 peru 2
哪一个很容易在php应用程序中查询和使用?
答案 0 :(得分:1)
这取决于您的要求,如果您需要更多灵活性,您可以拥有两个查找表(区域和地理位置)和一个'映射'表,您可以在其中创建不同的区域/地理位置配置。
这可以让您在不影响现有数据的情况下更灵活地进行不同的映射,但在这种情况下查看您可能不需要的数据。
答案 1 :(得分:1)
尽管非规范化的成本并不高,因为正如你所说,地理位置集很小而且稳定,但仍然值得拥有一个规范化的表(与你的第二个选项一样)。您可以决定添加(比方说)centralamerica
或其他地区。或者您可能需要更改使用的编码。规范化的全部目的是让您更容易处理不期望所做的更改,而不仅仅是您可以预见的更改。
查找的性能损失非常小(如果有的话)。使用基于FK的架构,更新将更容易,数据库可能会更小。
答案 2 :(得分:0)
听起来像AREA
和GEOLOCATION
表之间的简单的一对多关系。任何关系数据库都可以处理这样的事情。向GEOLOCATION
添加一个指向AREA
主键的外键,即可开展业务。不要忘记在GEOLOCATION
外键列中添加索引。
答案 3 :(得分:0)
这是denormalization,很好。我的非规范化规则是,如果我有理由,那就足够了。所以,只要你有理由进行这种非规范化,那么就继续。
上述设计不太可能使您的查询更加复杂。实际上,它可能会简化它们。它只是没有针对诸如“有哪些区域?”之类的问题进行优化。
而不是这个(标准化):
SELECT *
FROM areas
你必须这样做(非规范化):
SELECT DISTINCT area
FROM geolocation
如果geolocation
中有哪些区域没有行怎么办?你怎么知道他们?