我试图在postgres数据库中为rails应用程序规划一个数据模型,但是我想在将来为运行查询节省大部分时间。这是我的计划:
我有用户,演示文稿和评分。用户既可以参加演讲,也可以参加演讲。因此,用户可以拥有许多"介绍,但以两种不同的方式。 USERS(演示者)和演示文稿将是一对多,而USERS(参与者)和演示文稿将是多对多。
然后有评分。演讲有很多评级。所有评级也以两种方式属于USERS。 USERS(与会者)拥有他们提交的关于演示的所有评级,而USERS(演示者)对他们所呈现的演示有评价。在任何一种情况下,USERS通过演示都有很多评级。
这是设置此功能的最佳数据模型吗?我已经用图形方式在下面描述了它,以便更容易想象:
USERS
- HAS MANY presentations as an attendee - M2M
- HAS MANY presentations as a presenter
- HAS MANY ratings (through presentations) as an attendee
- HAS MANY ratings (through presentations) as an presenter
PRESENTATIONS
- BELONGS TO attendee user - M2M
- BELONGS TO presenter user
- HAS MANY ratings
RATINGS
- BELONGS TO presentations
- BELONGS TO attendee user through presentations
- BELONGS TO presenter user through presentations
答案 0 :(得分:0)
我会为每种类型的操作执行单独的关联表。您可能只需向presenter_id
表添加presentations
列,因为您正在描述has_one
的{{1}}关系,但拥有单独的关联模型可让您灵活如果您选择支持多个演示者的演示文稿,那么将来会成为presenters
关系。
使用以下配置,您可以致电has_many
以接收提交的用户。或presentation.presenter
接收参加的用户列表。或者另一方面,presentation.attendees
接收他们参加过的演示文稿列表,或user.attended_presentations
接收他们所呈现的演示文稿列表。您可以随意命名关联表,无论您认为哪种方式最有意义。
user.presented_presentations
对于评分,您可以让他们# User.rb
has_many :presentation_attendees
has_many :attended_presentations, through: :presentation_attendees, source: :presentation
has_many :presentation_presenters
has_many :presented_presentations, through: :presentation_presenters, source: :presentation
# Presentation.rb
has_many :presentation_attendees
has_many :attendees, through: :presentation_attendees, source: :user
has_one :presentation_presenter
has_one :presenter, through: :presentation_presenter, source: :user
# PresentationPresenter.rb
belongs_to :user
belongs_to :presentation
# PresentationAttendee.rb
belongs_to :user
belongs_to :presentation
和belongs_to :presentation
,以便您可以通过belongs_to :user
或演示文稿的所有评分来提取所有评分的列表使用user.ratings
,然后您可以在presentation.ratings
类上添加公共实例方法,以检索他们在以下位置展示的所有评分:
User
希望有所帮助!