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中填充特定的城市,即人口最多的城市和/或首都,对于美国来说,这两个城市分别是纽约和华盛顿特区,但对于英国来说,这两个城市都是伦敦。谢谢