【问题标题】:Can't figure out correct datastructure for table无法为表找出正确的数据结构
【发布时间】:2016-01-05 14:25:01
【问题描述】:

我有一个用户可以挑战另一个用户的应用程序。挑战有日期、时间、地点、获胜者、失败者、可以接受或拒绝的分数。 我正在考虑我应该应用的数据库结构。 起初,我创建了一个如下所示的挑战表:

 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 挑战。但是现在我的参赛者表似乎有点多余。

我想要实现的正确数据结构是什么?

【问题讨论】:

    标签: ruby-on-rails database jointable


    【解决方案1】:

    您可能不需要参赛者表。

    如果您在挑战表中再添加两列challenger 和challengee 或类似的东西会怎样?

    那么用户可以有challenger 的_many 挑战,也可以有challengee 的许多挑战。

    我认为您可以尝试这种方法。

    【讨论】:

      【解决方案2】:

      没有冗余,而且一直都是这样做的。让模型模拟您在业务领域中使用的术语

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多