在数据库中设计表的正确方法是什么?

时间:2012-02-29 23:30:55

标签: mysql

我想知道什么是正确的方法。

我们的区域可以是northamericasouthamerica

我们的帖子可以是slcmurryperumexico

因此,一个区域可以有许多地理位置。

这个表是

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应用程序中查询和使用?

4 个答案:

答案 0 :(得分:1)

这取决于您的要求,如果您需要更多灵活性,您可以拥有两个查找表(区域和地理位置)和一个'映射'表,您可以在其中创建不同的区域/地理位置配置。

这可以让您在不影响现有数据的情况下更灵活地进行不同的映射,但在这种情况下查看您可能不需要的数据。

答案 1 :(得分:1)

尽管非规范化的成本并不高,因为正如你所说,地理位置集很小而且稳定,但仍然值得拥有一个规范化的表(与你的第二个选项一样)。您可以决定添加(比方说)centralamerica或其他地区。或者您可能需要更改使用的编码。规范化的全部目的是让您更容易处理期望所做的更改,而不仅仅是您可以预见的更改。

查找的性能损失非常小(如果有的话)。使用基于FK的架构,更新将更容易,数据库可能会更小。

答案 2 :(得分:0)

听起来像AREAGEOLOCATION表之间的简单的一对多关系。任何关系数据库都可以处理这样的事情。向GEOLOCATION添加一个指向AREA主键的外键,即可开展业务。不要忘记在GEOLOCATION外键列中添加索引。

答案 3 :(得分:0)

这是denormalization,很好。我的非规范化规则是,如果我有理由,那就足够了。所以,只要你有理由进行这种非规范化,那么就继续。

上述设计不太可能使您的查询更加复杂。实际上,它可能会简化它们。它只是没有针对诸如“有哪些区域?”之类的问题进行优化。

而不是这个(标准化):

SELECT *
FROM areas

你必须这样做(非规范化):

SELECT DISTINCT area
FROM geolocation

如果geolocation中有哪些区域没有行怎么办?你怎么知道他们?