Устранить таблицу соединения в отношениях Hasmany в Rails
-
21-09-2019 - |
Вопрос
Я думаю о способах создания системы контроля доступа, основанной на роле, в 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 в мусор. Есть много альтернатив, и вы можете написать свой собственный.