2

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

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

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

或者

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

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

谢谢

4

3 回答 3

3

关系

第二组关系将是最合适的。正如 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

Rails 的用武之地

你的帖子被标记为 Ruby on Rails,所以我认为讨论 Rails 如何看待这种关系很重要。您熟悉belongs_tohas_many关联。has_manyRails 提供了一个很好的扩展: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
于 2013-05-06T13:04:07.580 回答
0

在 SQL 数据库中,您应该规范化您的数据,因此第二个变体更合适。

于 2013-05-06T11:42:14.560 回答
0

第二个版本比第一个更好,因为您只需要保留一次关联记录。在第一种情况下,您正在为一家根本不需要的餐厅节省城市和社区的空间……

于 2013-05-06T12:58:13.373 回答