Mysql 创建餐厅菜单我应该使用has_many through或habtm协会吗?

Mysql 创建餐厅菜单我应该使用has_many through或habtm协会吗?,mysql,sql,ruby-on-rails,postgresql,database-design,Mysql,Sql,Ruby On Rails,Postgresql,Database Design,我正在尝试创建一个餐厅项目,并为菜单设计数据库。在创建数据库模式时,我似乎一直在研究如何实现以下模型之间的正确关联MenuItem、Menu和一个Menu部分。每次我通过has\u many:through,以及has\u和\u belient\u many,我都能看到两者的好处,但当我实现它们时,我会感到困惑。此外,我对混音的自连接感到困惑,这让我更加反感 我认为我设计过度了,但对数据库模式进行一些输入会有所帮助。更具体地说,在您看来,以下场景应该使用哪种关联 到目前为止,我有三个类/表餐厅、

我正在尝试创建一个餐厅项目,并为菜单设计数据库。在创建数据库模式时,我似乎一直在研究如何实现以下模型之间的正确关联
MenuItem、Menu和一个Menu部分
。每次我通过
has\u many:through
,以及
has\u和\u belient\u many
,我都能看到两者的好处,但当我实现它们时,我会感到困惑。此外,我对混音的
自连接
感到困惑,这让我更加反感

我认为我设计过度了,但对数据库模式进行一些输入会有所帮助。更具体地说,在您看来,以下场景应该使用哪种关联

到目前为止,我有三个类/表<代码>餐厅、菜单和菜单项<代码>以及我精心设计的场景:

class Restaurant
  has_many :menus  (#Desert, Drinks, Dinner, Lunch, etc.)
end

class Menu
  has_many :sections, class_name: "Menu", foreign_key: "sections_id"
  belongs_to :section, class_name: "Menu"

  has_many :menu_items, through: :sections

  belongs_to :restaurant
end

## Context for the Menu and Sections
If I had a drinks menu with the following sections, Non Alcoholic, 
Spirits, Wine, etc. These 'sections' are essentially menus with 
their own menu items. This is why I put a self join on the Menu 
class. Maybe Im mistaken.


 class MenuItem
   belongs_to :section, class_name: "Menu"
   belongs_to :menu
 end 

 ####
 The menu item for example of 'Yellow Tail Merlot' belongs to the 
 section "Wine" under the menu of "Drinks". This is precisely where
 I am getting thrown off. I get the feeling that I'm making this 
 too complicated but when I say it out loud to myself it makes 
 perfect sense. 
好的,现在是habtm的第2版:

class Restaurant
  has_many :menus  (#Desert, Drinks, Dinner, Lunch, etc.)
end

class Menu
   has_and_belongs_to_many :menu_items
end


 class MenuItem
  has_and_belongs_to_many :menus
  has_and_belongs_to_many :sections, class_name: "Menu"
 end 
正如您所看到的,上面版本2中的代码变得毛茸茸的。事实上,我甚至不知道has_和_属于_-to_-many的部分是否可能。不管怎样,这是我从Rails文档中获取的基本原理

A has_和_beside_to_许多关联创建了与另一个模型的直接多对多连接,没有中间模型。例如,如果您的应用程序包括菜单和菜单项,并且每个菜单都有许多菜单项,并且每个菜单项都出现在许多菜单中,则可以这样声明模型


报价来自rails文档,但我使用菜单和菜单项切换了部件和零件。这样读完全有道理。现在我问你们,你们觉得怎么样?使用哪一个更好?谢谢。

我会使用
属于
,而不是在菜单表上使用自联接,创建一个名为
节的新类/表

更新内容将是:

高级餐厅
有很多菜单吗
结束
班级菜单
有很多:菜单项
有很多:部分
属于:餐厅
结束
班级
属于:菜单
有很多:菜单项
结束
类菜单项
属于:菜单
属于:节
结束
您描述的部分有更多的类别,例如,葡萄酒是一种酒精饮料,葡萄酒是菜单项,“酒精饮料”是类别。你甚至可以更进一步,将葡萄酒与“酒精”和“饮料”两部分联系起来

我应该使用HASU MUN THRON或habtm协会吗

它们都可以用于创建类似的多对多关联。关键的区别在于,
has_和_belient_to_many
没有为连接实体使用模型。虽然这听起来简单而吸引人,但它确实有一些巨大的缺点:

  • 没有实际的方法在联接表上添加access附加列。例如,您希望添加一个“位置”列来对项目进行排序-您运气不佳,因为
    has\u和\u belies\u属于\u many
  • 无法直接查询联接表
因此,
拥有和属于许多
对于那些零复杂性的情况来说是很好的,但在现实生活中却不是很好。对于其他的一切,
都有很多通过:

class Restaurant
  has_many :menus
  has_many :menu_sections, through: :menus
  has_many :menu_items, through: :menu_sections
end

class Menu
  belongs_to :restaurant
  has_many :menu_sections
  has_many :menu_items, through: :menu_sections
end

class MenuSection
  belongs_to :menu
  has_one :restaurant, through: :menu
  has_many :menu_items
end

class MenuItem
  belongs_to :menu_section
  has_one :menu, through: :menu_section
  has_one :restaurant, through: :menu
end

AFAIK HABTM在Rails 4中被弃用,可能更早。我一直觉得有很多通过:是一个更干净的选择自我加入在这里不是真的相关。例如,在
users.manager\u id
上有一个用户表,员工在该表中加入经理(也是用户表上的记录)。你正在构建的是一个层次结构,因此它显然是一个错误的工具。