Устранить таблицу соединения в отношениях Hasmany в Rails

StackOverflow https://stackoverflow.com/questions/2300628

Вопрос

Я думаю о способах создания системы контроля доступа, основанной на роле, в Rails. Я тоже видел эти замечательные проекты (среди прочего):

Мой вопрос: действительно ли необходимо иметь таблицу соединения для всего? Если я одна из таблиц в отношениях имеет только несколько значений (скажем, менее 100), я не могу просто объединить таблицу соединения с этой маленькой таблицей?) Это то, что я имею в виду ... вот что мне нужно:

Модели

  • Пользователь
  • Группа
  • Роль
  • Разрешение
  • Userles/Rolesusers
  • Grouples
  • Членство (Groupusers)
  • Ролеозапись

Что-то такое...

Способ RoleReerquirement Работы - это создание roles стол и roles_users Присоединяйтесь к таблице. Это означает, что если у меня есть 20 возможных ролей в приложении, у меня есть

  • Таблица ролей с 20 рядами
  • Ролизовые таблицы с n рядами.

Это означает, что каждый раз, когда я хочу найти пользователя по роли, я должен сделать присоединение. Мне интересно, поскольку в приложении будет только несколько ролей, почему бы просто не заменить эту миграцию:

create_table "roles", :force => true do |t|
  t.string "name"
end

create_table "roles_users", :id => false, :force => true do |t|
  t.integer "role_id"
  t.integer "user_id"
end

с этим...

create_table "roles", :force => true do |t|
  t.string "name"
  t.integer "user_id" # or some polymorphic form
end

Это приведет к дублированию (например, тонны ролей, называемых «администратором»), но, поскольку пространство дешево, и мы могли бы создать такой метод, как Role.unique Чтобы найти все уникальные роли (чтобы избавиться от этого 20-рядного стола), почему люди создают таблицу соединения?

То же самое с разрешениями: у меня, вероятно, будет только 4 разрешения на начало: create read update delete. Анкет Так что мне не нужна таблица разрешений и таблица Roles_permissions, я мог бы просто дублировать разрешения CRUD и иметь ROLE_ID в таблице разрешений. То же самое с группой, мне не нужны группы групп, если у меня были полиморфные колонны в моем roles стол.

Как рекомендуется сделать это?

Вот фрагмент предложенной миграции.

Это было полезно?

Решение

Я бы не предложил вам это сделать. То, что вы описываете, называется денормализация.

Денормализация вводит проблемы для многих приложений и должна быть выполнена только в том случае, если у вас есть ясно необходимость для этого. Обычно я обозначает только таблицы для отчетности.

Ваш вопрос не показывает, что вам необходимо денормализовать. Скорее, это показывает ошибочное отвращение к наличию «дополнительных» таблиц и избегания простого соединения. Наличие дублированного стоимость данных больше, чем просто пространство, это также стоит производительности (уникально не бесплатная). Современные RDBM довольно искусны при обработке соединений.

Я бы предложил Googling и поиск, чтобы получить информацию о денормализации. Золотого правила нет, но у вашего дела, похоже, нет веских причин.

Если вы ищете повышение производительности, добавьте Activerecord в мусор. Есть много альтернатив, и вы можете написать свой собственный.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top