2010-10-10 77 views
1

我想了解这个概念。例如:我有两张桌子城市和国家。基本桌面设计Q

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这是美国走出城市桌的主要关键,所以桌子看起来干净,容易理解?我假设如果这些被引用,明天如果我将美国更新为20,它将在城市表中自行更新,如果我将美国重命名为美国,它将自行更新到城市表中。

  • 我的DB是在MySQL

回答

0

你不知道,如果你需要有在DB“可用”的表,所以有人可以轻松地查看一些与选择有用的*等。(或者更容易手动编写SQL)。然后按照上面的常规形式创建表格,然后创建一个组合表格的VIEW。

+0

更输出。如果我使用城市查找表作为autosuggest,我想显示:美国纽约。这是最终目标。为了得到它,这意味着我必须查找城市,然后看到19国的参考,在国家表中找到19并输出美国,所以它读取美国纽约。 ...但是如果我在城市表中有国家名称,那么这是一个简单的输出,不会触及两个表格。注意:这仅是示例。我有数百个这样的查找需要创建acoss多个表,因此我试图理解所有这些基本概念。 – Ian 2010-10-10 02:52:41

+0

我想确保如果我在城市表中保留国家/地区名称,它仍然与它的父国家/地区表有关,因此任何未来的名称或ID更改都会反映到所引用的所有表上。 – Ian 2010-10-10 02:54:09

+0

哈哈,所以你认为从一个简单的连接性能打击会花费你很多,它是值得的,以保持你的表格不正常的形式? – 2010-10-10 03:07:43

0

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

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

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

我的语法是关闭的,但这实质上就是你想要的。

1

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

至于查看数据,使用视图来创建一个漂亮的表:

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; 
+0

这只是一个例子。我有很多像邻域,州,地区,本地,邮政等数据需要连接到eachother,所以我想理解所有这些表使用的概念,所以1)表中的数据是有道理的, 2)联接数量少,3)数据可以在表格之间保持同步(如强制执行),所以如果我对主查找表进行更改,其他任何名称更改都会更新。 – Ian 2010-10-10 02:57:57

+0

然后,你将不得不决定如何处理事情。你进入凶猛复杂的领域,特别是如果你想分析不同国家的地址。您可以创建表以避免连接;请注意,与完全标准化的表相比,您正在为自己设置非常复杂的更新操作。如果使用完全标准化的表格 - 如果它们经常改变,你可能会更好。如果它们一旦建立就基本是静态的,那么可能“预加入”版本更好。但是,你对美国以外地址的分析将是关键因素。 – 2010-10-10 03:16:03

+0

另见:[SO 3094126](http://stackoverflow.com/questions/3094126/best-practice-standard-for-storing-an-address-in-a-sql-database/),[S 929684O]( http://stackoverflow.com/questions/929684/is-there-common-street-addresses-database-design-for-all-addresses-of-the-world/),[SO 310540](http:// stackoverflow .com/questions/310540/best-practices-for-storage-postal-addresses-in-a-database-rdbms /),仅列出三个。 – 2010-10-10 03:19:15