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

Mysql 在数据库中设计表的正确方法是什么?,mysql,Mysql,我想知道什么是正确的方法 我们的区域可以是北美,南美 我们的地点可以是slc,murry,peru,mexico 因此,一个地区可以有许多地理位置 这张桌子是 ID Area Geolocation 1 NA slc 2 NA murry 3 SA peru 4 SA mexico 如果面积和地理位置的数量非常有限,并且预计不会增长,那么您是否看到这种类型的设计与FK表格

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

我们的区域可以是
北美
南美

我们的地点可以是
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应用程序中,哪一个更容易查询和使用?

听起来像是
区域
地理位置
表之间的简单一对多关系。任何关系数据库都可以处理这样的事情。向
地理定位
添加一个外键,该外键指向
区域
主键,您就可以开始工作了。不要忘了在
地理位置
外键列中添加索引。

这取决于您的要求,如果您想要更大的灵活性,您可以有两个查找表(面积和地理位置)和一个“映射”表,您可以在其中创建不同的面积/地理位置配置


这将为您提供更大的灵活性,在不影响现有数据的情况下进行不同的映射,尽管在这种情况下查看数据可能不需要它。

尽管反规范化成本不高,因为正如您所说,地理位置集小且稳定,但拥有一个规范化表仍然是值得的(与您的第二个选项一样)。您可以决定添加(例如)
centralamerica
或其他区域。或者您可能需要更改所使用的编码。规范化的全部目的是使您能够更轻松地处理未预料到的更改,而不仅仅是您可以预见的更改

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

这是而且很好。我的反规范化规则是,如果我有理由,那就足够了。因此,只要你有理由进行此类反规范化,然后继续

上述设计不太可能使您的查询变得更复杂。事实上,它可能会简化查询。它只是不适合提出诸如“哪些领域?”

与此相反(标准化):

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


如果有一些区域在
geolocation
中还没有行呢?您如何知道它们呢?

谢谢您的帮助。这些区域和GEOLOCATIONS没有增长,是静态的(数据永远不会添加到这些表中。)使用外键或不使用外键设计表的最佳方法是哪一种?为什么?为什么?我想我已经说得很清楚了:使用外键。你想要引用完整性和规范化。我想你错过了OP的问题。他知道外键,并且询问在所述assum下非规范化模式的优缺点选项。感谢您的帮助。区域和地理位置没有增长,并且是静态的(数据永远不会添加到这些表中。)哪种方法是设计带外键或不带外键的表的最佳方法,以及为什么和为什么不。视图可以使规范化架构的查询与非规范化架构的查询一样简单。在这种情况下,我看不到任何其他非规范化原因。@TedHopp,很好,当然不考虑性能。
SELECT *
FROM areas
SELECT DISTINCT area
FROM geolocation