@movetz

Как лучше всего хранить несколько пользователей с общими свойствами?

Суть задачи:
Есть 3 типа пользователей, у все 3х типов есть, как общий, так и уникальных для каждого, набор свойств, так же у 2-го и 3-го есть свойства которых нет у первого.
На данный момент есть идея сформировать базу следующим образом (схему приложу позже, пишу с телефона):
  • таблица user, для всех общий свойств, pk каждого пользователя хранить в ней
  • таблица user_common_type_2_3, для хранения общих свойств для типа 2 и типа 3
  • таблицы user_type_1, user_type_2, user_type_3

связи между таблицами - 1:1
Но такая идея настораживает - завтра может появиться пользователь с типом 4, 5, 6..., у которого есть общие свойства с 1м, 3м и т.д.

Второй вопрос:
Как это лучше всего реализовать в приложении.
Понятное дело, нужно создать базовый класс, потом его унаследовать. В каждом классе иметь определенный для конкретного пользователя набор свойств и с этим интерфейсом работать далее.
Реализация с собственным написанием запросов проблем не вызывает, но как это реализовать с помощью ORM не совсем понятно. Интересна была бы реализация с помощью Active Record и Doctrine (на Symfony решал подобную задачу ранее, но было только два типа пользователей и реализация без использования Doctrine).

Заранее большое спасибо.
  • Вопрос задан
  • 2469 просмотров
Пригласить эксперта
Ответы на вопрос 4
Наборы свойств - это, по факту, роли. Разрешения даются ролям, а юзеры могут иметь несколько ролей. При проверке права юзера на действие надо проверить права каждой из его ролей. Очень странный вопрос, так как в Yii уже есть RBAC.
Ответ написан
@Arik
как вариант можно посмотреть в сторону NoSQL решений
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Общее - в одной таблице, разное - в отдельных. Если user_type_2 и user_type_3 - это одно и то же с точки зрения бизнес логики - в одной, в противном случае в разных. Требования скорее всего поменяются и не один раз по этому дешевле и проще перестраховаться.
Ответ написан
Комментировать
@yuras666
Можно хранить все данные в одной таблице с полем "type", где будет храниться описание, что это за пользователь. Как-то так . Таким образом, избавишься от связи 1 к 1. Можешь сделать с 1 к 1 как сам и написал. Если работаешь с "симфони", то "доктрина" оба эти варианта поддерживает из коробки, смотри тут .
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы