我有一份餐馆清单。每个都位于特定城市的社区/地区。
我如何将餐厅与社区和城市联系起来?我想做:
Restaurant (belongs_to) -> Neighborhood
Restaurant (belongs_to) -> City
或者
Restaurant (belongs_to) -> Neighborhood
Neighborhood (belongs_to) -> City
采取一种或另一种方法的优点或缺点是什么,我应该选择什么?
谢谢
我有一份餐馆清单。每个都位于特定城市的社区/地区。
我如何将餐厅与社区和城市联系起来?我想做:
Restaurant (belongs_to) -> Neighborhood
Restaurant (belongs_to) -> City
或者
Restaurant (belongs_to) -> Neighborhood
Neighborhood (belongs_to) -> City
采取一种或另一种方法的优点或缺点是什么,我应该选择什么?
谢谢
第二组关系将是最合适的。正如 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_id
从 Restaurant 中删除该列。
Restaurant (belongs_to) -> Neighborhood
Neighborhood (belongs_to) -> City
Table: Restaurant
Column | Type |
---------------------------------------------
ID | Integer | Primary Key
name | String |
neighborhood_id | Integer | Foreign Key
你的帖子被标记为 Ruby on Rails,所以我认为讨论 Rails 如何看待这种关系很重要。您熟悉belongs_to
和has_many
关联。has_many
Rails 提供了一个很好的扩展:through
选项。
我假设您有兴趣将 City 存储在 Restaurant 表中,因为您希望能够找到属于整个城市的所有餐厅。:through
选项has_many
允许该功能。
你的模型看起来像这样
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
在 SQL 数据库中,您应该规范化您的数据,因此第二个变体更合适。
第二个版本比第一个更好,因为您只需要保留一次关联记录。在第一种情况下,您正在为一家根本不需要的餐厅节省城市和社区的空间……