如何在 rails 中正确维护数据库架构?

How to correctly maintain database schema in rails?

我有这样的架构:

create_table "grades", force: :cascade do |t|
    t.integer "cls"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "post_grades", force: :cascade do |t|
    t.integer "post_id"
    t.integer "grade_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "posts", force: :cascade do |t|
    t.integer "user_id", null: false
    t.string "title"
    t.text "content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

create_table "user_grades", force: :cascade do |t|
    t.integer "user_id"
    t.integer "grade_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

在此模式中,成绩、帖子和用户都相互关联。

所以我的第一个问题:这样做是否正确?

假设其中一个用户在他的列中添加了等级 4 (cls = 4),而另一个用户添加了相同的等级。现在,对于两个不同的等级 ids.So,我在等级 table 中具有相同的 cls 值 ids.So 此架构中是否存在任何数据冗余?

因为我接到了你的任务,你可以采用这样的解决方案:

  1. grades -> 没有引用(就像现在一样)
  2. user_grades(命名此 table 的常规方式是 grades_users... 按字母顺序且均为复数形式)-> user_idgrade_id(就像现在一样)
  3. 你不需要post_grades。多余
  4. posts -> grade_id, user_id(如果需要作者)

您的 schema.rb 看起来像:

create_table "users", force: :cascade do |t|
  ...
end

create_table "grades_users", force: :cascade do |t|
  t.integer "user_id"
  t.integer "grade_id"
  ...
end

create_table "grades", force: :cascade do |t|
  ...
end

create_table "posts", force: :cascade do |t|
  t.integer "user_id", null: false
  t.integer "grade_id", null: false
  ...
end