关于中间可选模型的基本数据库设计

TJ *_*ntz 4 sql database database-design ruby-on-rails

我正在开展一个项目,在这个项目中我遇到了一个看似非常简单的场景设计的困难:

user属于citycountry,然而,city参考可以是null同时user必须属于一个country仍然.换句话说(在基本的 RoR模型语法中),

# class User < ActiveRecord::Base 
belongs_to :city
belongs_to :country
validates_existence_of :country

# class City < ActiveRecord::Base
has_many :users
belongs_to :country
validates_existence_of :country

# class Country < ActiveRecord::Base
has_many :users
has_many :cities    
Run Code Online (Sandbox Code Playgroud)

我这个超级简单设计的问题在于冗余太多了.一旦a city被a 引用user,country引用就可以从它推断出来(换句话说,因为它已经在city表中引用,所以在表中引用它似乎并不那么令人敬畏user).

Mar*_*ema 5

当A(城市)也唯一地标识B(国家)时会发生这种情况,但A是可选的,而B是强制性的.基本上,仅添加国家/地区是因为城市是可选的,而仍需要识别每个用户的国家/地区.

将国家和城市联系在一起的想法可能看起来很有吸引力,因为一个城市独特地"识别"了一个国家,但是:是吗?阿姆斯特丹不仅仅是荷兰的一个城市.

此外,它还带有您在评论中已经提到过的问题......您如何处理其他数据; 并列出这样的国家现在需要将它们从国家/城市合并中过滤掉.

您的原始设计可能感觉多余且数据方面可能是,但逻辑方面和需求方面则不然.我会坚持,因为它非常清楚,完美地反映了要求.而且我会学会忍受令人难以置信的冗余.你可能想出的任何"解决方案",以避免"冗余",可能会最终混淆水域.或者将来更难以定义查询.