我有一个用户可以挑战其他用户的应用程序。挑战有日期,时间,地点,胜利者,失败者,可以接受或拒绝的分数。 我正在考虑应该应用的数据库结构。 起初我创建了一个如下所示的挑战表:
create_table "challenges", force: :cascade do |t|
t.date "date"
t.time "time"
t.text "place"
t.text "score"
t.integer "winner"
t.integer "loser"
t.integer "referee"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "accepted", default: false
我还使用user_id和challenge_id
创建了参赛者联接表 create_table "contestants", force: :cascade do |t|
t.integer "user_id"
t.integer "challenge_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我不确定这是正确的数据结构,因为我现在在挑战的创建者和“收件人”之间的视图(不同的部分)中有所区别。 因此,我现在添加了一个直接将挑战链接到用户的迁移:挑战属于用户(挑战的创建者)和用户has_many挑战。但是现在我的参赛者表似乎有点多余了。
我想要实现的目标的正确数据结构是什么?
答案 0 :(得分:1)
您可能不需要参赛者表。
如果您为challenger
和challengee
的挑战表或其他类似内容添加另外两列,该怎么办?
然后,用户可以像challenger
一样遇到很多挑战,并且还有challengee
的许多挑战。
我认为你可以尝试这种方法。
答案 1 :(得分:0)
没有冗余,这是一直这样做的。让模型模拟您在业务领域中使用的术语
class User
has_many :challenges #issued challenges
has_many :authored_challenges, dependent: :destroy, class_name: Challenge
end
class Challenge
belongs_to :author, class_name: User, foreign_key: 'author_id'
belongs_to :recipient, class_name: User, foreign_key: 'user_id'
end