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
上有一个用户表,员工在该表中加入经理(也是用户表上的记录)。你正在构建的是一个层次结构,因此它显然是一个错误的工具。