基本表设计问:

时间:2010-10-10 02:45:11

标签: mysql database schema

我试图理解这个概念。例如:我有两个表City和Country。

Country
-------
id  
abbreviation   
name   


City
-----
id   
name   
Country (name or id, or both? - This is the question)

引用并保持特定城市与其所属的国家/地区同步,我想这将引用country.id作为FK。这意味着城市表的一个例子是:(200,纽约,19) - 其中19 =美国国家表。但这对查看桌子的人没有帮助,因为他不知道19是什么而没有在国家表中查找19是什么。

所以我想将国家名称也添加到城市表中,如下所示:(200,纽约,美国)。我不需要显示19,因为19对读者没有用处,但仅用于连接表格。

那么我的表格colunms / FK应该是什么样才能存储在像这样的城市表行(200,纽约,美国)中,但确保纽约将始终引用美国的美国查找并保留19是美国城市表的主要关键,所以表格看起来干净,易于理解?并且我假设如果这些被引用,明天如果我将USA更新为20,它将在city表中自行更新,同样如果我将USA重命名为US,它将自己在city table上更新?

  • 我的数据库在MySQL

3 个答案:

答案 0 :(得分:1)

为什么不使用ISO 3166国家/地区代码(2个字符或3个字符)作为国家/地区ID?这会在城市表中留下可识别的代码;您可以映射到国家/地区表中的全名。

至于查看数据,使用VIEW创建一个好看的表:

CREATE VIEW CityInfo(CityID, CityName, CountryID, CountryName) AS
    SELECT ci.id, ci.name, ci.country, co.name
      FROM City AS ci JOIN Country AS co ON ci.Country = co.id;

答案 1 :(得分:0)

你没有...如果你需要在数据库中有“可用”表,那么有人可以轻松地查看select *等有用的东西(或者更容易手工编程SQL)。然后以正常形式创建上面的表,然后创建一个组合表的VIEW。

答案 2 :(得分:0)

人们不应该查看表:某些应用程序应该访问表,以便以可以解析它的方式向人们呈现数据。你希望在你的表中将country.id作为FK的原因是你没有一百万行,其国家名称是“USA”,因为这样会出现各种各样的问题,比如当你输入错误时会发生什么“美国A”登陆其中一个领域?或者如果你想改变用户从“美国”到“美国”的看法怎么办?

处理它的正确方法是使用你最初建议的country.id,然后使用JOIN语句来显示数据,如下所示:

SELECT city.name, country.name
  FROM city JOIN country ON country.id = city.country

我的语法可能会关闭,但这实际上就是你想要的。