Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql/RoR数据库设计_Mysql_Database_Ruby On Rails 3_Database Design - Fatal编程技术网

mysql/RoR数据库设计

mysql/RoR数据库设计,mysql,database,ruby-on-rails-3,database-design,Mysql,Database,Ruby On Rails 3,Database Design,表中有两个与列相同的外键可以吗 我有两张桌子,一张是乡村,另一张是城市。在国家表中: 国家 ------- 身份证件 名称 capitalcity我会这样设计 COUNTRY -------------- id name CITY ------- id country_id ( useful to know what country a city is in ) name created_at updated_at CAPITALS ---------- id city_id

表中有两个与列相同的外键可以吗

我有两张桌子,一张是乡村,另一张是城市。在国家表中:

国家 ------- 身份证件 名称
capitalcity我会这样设计

COUNTRY
--------------
id
name    

CITY
-------
id
country_id   ( useful to know what country a city is in  )
name
created_at
updated_at

CAPITALS
----------
id
city_id         Unique

POPULUS
-------
id
city_id         Unique

是的,没关系。人们有时会避免这种明确的FK,因为它们不灵活,但如果你知道你总是需要准确地联系这两个城市,这是合适的设计。在任何情况下,您都不需要这些FKs和bool标志

我看不到的是,如何将非首都而非人口最多的城市与国家联系起来。如果你不小心如何设计你的钥匙,你可能最终会遇到这样的情况:一个城市可以成为它不属于的国家的首都

使用标识关系可以避免此问题:

因此,每个城市都由一个在其国内的城市编号来标识。当PK从一个城市迁移回另一个国家时,COUNTRY_ID将合并回其原始位置,因此COUNTRY.COUNTRY_ID上不能有国家不匹配注释FK1和FK2

CAPITAL_NO和Populary_NO可以保留为空,因此它们可以暂时保持为空,以解决循环FKs引起的鸡和蛋问题。这是因为InnoDB使用方法强制FKs,所以只要复合FK的一个组件为NULL就足以避免FK冲突

BTW,考虑你是否真的需要PopueSuID——如果你保持所有城市的人口,那么你可以通过找到MAX.

得出哪个人口最多。
如果您需要为孩子FKs或安抚您的ORM添加一个代理密钥,如CITY_ID…

非常感谢您的回答。好像我忘了换个角度思考。。。城市可以属于国家。哦@DeiS这种设计并没有像你问题中目前所说的那样对你的需求建模。例如,没有什么可以阻止一个国家拥有多个首都或多个人口最多的城市。国家id可以像编辑之前一样放在首都和人口中,但这仍然允许一个城市成为它不属于的国家的首都,除非你使用识别关系,但是这个设计开始接近我所拥有的。好吧,我明白你的意思。我需要好好考虑一下。越来越奇怪了。这是我设计这一部分的宏伟构想:国家将通过其ISO3166-2代码来识别,然后我会有州,可能会下降到三个级别。不相邻的国家,每个国家应该有一个首都,一个人口稠密的城市,然后每个州都可以有相同的。我认为这是一个很好的答案,虽然我需要读几遍才能理解其中的逻辑。信不信由你,十多年前我在大学里做过db设计,直到第五个nf。当实际为特定需求建模时,可能会变得相当混乱。ThanksI还应该指出,我正在使用RubyOnRails为我完成所有数据库建模关系,当我完成设计时,我将在数据库端镜像关系并减少列的长度。倒数第二段也是值得思考的,我的想法是在db中填充特定的城市,即人口最多的城市和/或首都,对于美国来说,这两个城市分别是纽约和华盛顿特区,但对于英国来说,这两个城市都是伦敦。谢谢