Ruby on rails 如何存储与餐厅相关的城市和社区?

Ruby on rails 如何存储与餐厅相关的城市和社区?,ruby-on-rails,database-design,model,Ruby On Rails,Database Design,Model,我有一张餐馆的名单。每一个都位于一个特定城市的一个社区/地区 我如何将餐厅与社区和城市联系起来?我想做什么: Restaurant (belongs_to) -> Neighborhood Restaurant (belongs_to) -> City 或 采取一种或另一种方法的优点或缺点是什么?我应该选择什么 谢谢在SQL数据库中,您应该规范化数据,所以第二个版本更合适。第二个版本比第一个版本更好,因为您只需要保存一次关联记录。在第一种情况下,你是多余的试图挽救城市和社区的餐厅,

我有一张餐馆的名单。每一个都位于一个特定城市的一个社区/地区

我如何将餐厅与社区和城市联系起来?我想做什么:

Restaurant (belongs_to) -> Neighborhood
Restaurant (belongs_to) -> City

采取一种或另一种方法的优点或缺点是什么?我应该选择什么


谢谢在SQL数据库中,您应该规范化数据,所以第二个版本更合适。

第二个版本比第一个版本更好,因为您只需要保存一次关联记录。在第一种情况下,你是多余的试图挽救城市和社区的餐厅,这是根本不需要的

关系 第二组关系是最合适的。正如Mik_Die提到的,主要原因是它被规范化了。如果您要查看第一个示例中的DB模式,您将看到如下内容

Restaurant (belongs_to) -> Neighborhood
Restaurant (belongs_to) -> City

Table: Restaurant
Column          |  Type       | 
---------------------------------------------
ID              |  Integer    |  Primary Key
name            |  String     |
neighborhood_id |  Integer    |  Foreign Key
city_id*        |  Integer    |  Foreign Key

Table: Neighborhood 
Column          |  Type       | 
---------------------------------------------
ID              |  Integer    |  Primary Key
name            |  String     |
city_id*        |  Integer    |  Foreign Key

Table: City 
Column          |  Type       | 
---------------------------------------------
ID              |  Integer    |  Primary Key
name            |  String     |
如果您查看我在旁边放了一个星号的列,您将看到它在两个不同的表中重复,这是在规范化数据库时要避免的

第二个模式将几乎相同。您只需从餐厅中删除
city\u id
列即可

Restaurant (belongs_to) -> Neighborhood
Neighborhood (belongs_to) -> City

Table: Restaurant
Column          |  Type       | 
---------------------------------------------
ID              |  Integer    |  Primary Key
name            |  String     |
neighborhood_id |  Integer    |  Foreign Key
Rails的作用是什么 您的帖子被标记为RubyonRails,因此我认为讨论Rails如何看待这种关系很重要。您熟悉
所属的
,并且
有许多关联。Rails通过
:through
选项提供了对
的极好扩展

我假设您有兴趣将城市存储在餐厅表中,因为您希望能够找到属于整个城市的所有餐厅。
:through
选项有许多
允许该功能

你的模特看起来像这样

class Restaurant < ActiveRecord::Base
  belongs_to :neighborhood
end

class Neighborhood < ActiveRecord::Base
  has_many :restaurants
  belongs_to :city
end

class City < ActiveRecord::Base
  has_many :neighborhoods
  has_many :restaurants, through: :neighborhoods
end
@neighborhood.restaurants # => Returns all restaurants for that neighborhood
@city.restaurants # => Returns all restaurants from each of the neighborhoods belonging to the city

为什么第一个版本不规范化?
@neighborhood.restaurants # => Returns all restaurants for that neighborhood
@city.restaurants # => Returns all restaurants from each of the neighborhoods belonging to the city