денормализованная схема обработки авторизации - PullRequest
0 голосов
/ 06 февраля 2019

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

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

C Создать, R Читать, U Обновить, D Удалить

enter image description here

У меня есть следующая структура базы данных с postgresql 9

1) user таблица has_many записи внутри stores таблица.

-----------------------------
| id  | org_tag  |  email   |
|---------------------------|
|  1  |    a     | a@em.com |
|---------------------------|
|  2  |    b     | b@em.com |
|---------------------------|
|  3  |    c     | c@em.com |
-----------------------------

2) stores таблица включает в себя jsonb столбец employees, user_id и tags столбец массива

Владелец store может добавить employeesв магазин, который будет иметь специальные authorization гранты в зависимости от role.

Я фильтрую хранилище на основе массива tags для scope данных и обрабатываю авторизацию.

----------------------------------------------
| id  | user_id  |  employees  |     tags     |
|---------------------------------------------|
|  1  |    1     |  see json1  |  ['a', 'b']  |
|---------------------------------------------|
|  1  |    1     |  see json2  |  ['a', 'c']  |
-----------------------------------------------

Значение json1 равно

[{'email':'a@em.com','role':'owner'},{'email':'b@em.com','role':'trial_editor'}]

tags соответствует user.org_tag

Значение json2 равно

[{'email':'a@em.com','role':'owner'},{'email':'c@em.com','role':'manager'}]

3) products стол

Банка trial product editorредактировать только тот продукт, которому он был назначен.Я могу определить product s на tags, но я не знаю, как обрабатывать различные roles

Например. Store Manager может создавать продукты, а Trial Product Editor может только читать и обновлять.

--------------------------------
| id  | user_id  |    tags     |
|------------------------------|
|  1  |    1     | ['a', 'b']  |
|------------------------------|
|  1  |    1     | ['a', 'c']  |
--------------------------------

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Пользователь

------------------------------------------------------
| id |  org_tag   |     email      |    org_handle   | 
------------------------------------------------------
|  1 |     a      |  a@email.com   |       xyz       | 
------------------------------------------------------ 
|  2 |     b      |  b@email.com   |       xxx       |  
------------------------------------------------------
|  1 |     c      |  c@email.com   |       abc       | 
------------------------------------------------------

Роль

------------------------------------------------
| id  |  store_id  |  user_id  |    position   |
------------------------------------------------ 
|  1  |     1      |     1     |     owner     |
------------------------------------------------ 
|  2  |     1      |     2     |    manager    |
------------------------------------------------ 
|  1  |     2      |     2     |  trial_editor |
------------------------------------------------ 

Магазин

-----------------------------------
| id  |  employees  |  org_handle |
-----------------------------------
|  1  |  see json1  |     abc     |
-----------------------------------
|  2  |  see json2  |     xyz     |
-----------------------------------

сотрудников jsonb :

[{'email':'a@em.com','role':'owner'},{'email':'b@em.com','role':'trial_editor'}]

Продукт

--------------------------------
| id  | store_id |   role_id   | 
--------------------------------
|  1  |     1    |      1      |
--------------------------------
|  2  |     2    |      2      |
--------------------------------

Ассоциации

Organization has_many :users
User has_many :stores, through: roles
User has_many :role
User belongs_to :organization
Role belongs_to :user
Role belongs_to :store
Role has_many :products
Store has_many :users, through: roles
Store has_many :roles
Store has_many :products
Product belongs_to :store
Product belongs_to :role
0 голосов
/ 06 февраля 2019

Вы, кажется, слишком экономны с таблицами.Вам, кажется, нужно:

  • employees с одной строкой на сотрудника
  • storeEmployees с одной строкой на сотрудника (при условии, что сотрудники могут находиться в нескольких магазинах)
  • storeEmployeeTags с одной строкой на магазин / сотрудника / тег

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...