Как правильно поддерживать схему базы данных в рельсах? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть такая схема:

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) в свой столбец, а другой пользователь добавил ту же оценку. Теперь у меня есть одинаковое значение cls в таблице оценок для двух разных идентификаторов оценок. Так есть ли в этой схеме избыточность данных?

1 Ответ

0 голосов
/ 03 мая 2018

Поскольку я получил вашу задачу, вы можете пойти с таким решением:

  1. grades -> нет ссылок (как сейчас)
  2. user_grades (условное название этой таблицы будет grades_users ... в алфавитном порядке и во множественном числе) -> user_id, grade_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
...