Гость
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Скрыть поля в таблице users / 13 сообщений из 13, страница 1 из 1
29.06.2021, 14:17
    #40080709
Elfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Добрый день!

Есть таблица users, в ней пользователи хранят свои персональные данные.
Часть полей, такие как email или phoneNumber являются обязательными для заполнения, но тем, не менее, пользователь по желанию хотел бы закрыть эти поля для публики. На таблицу смотрит сервер node.js и на сайт выводит json по полям этой таблицы.

Если пользователь не хочет, чтобы его данные были доступны всем пользователям сайта, то где в базе хранить эти запреты?
Как это оптимальнее всего спроектировать? Как это делают социальные сети обычно?

Мне На ум приходит только создать еще поле типа hideEmail = true или hidePhone = true и программно анализировать эти поля и в зависимости от этого уже выводить эту информацию или нет.

Буду рад любым идеям на этот счет.
...
Рейтинг: 0 / 0
29.06.2021, 14:31
    #40080712
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Elfix
Мне На ум приходит только создать еще поле типа hideEmail = true или hidePhone = true и программно анализировать эти поля и в зависимости от этого уже выводить эту информацию или нет.


А что, есть какой--то иной путь? Не можно конечно управлять видимостью объектов на форме/странице, но это некорректно.

Корректно именно что никак не выдавать инфу на клиента, если она закрыта.
...
Рейтинг: 0 / 0
29.06.2021, 15:10
    #40080726
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Elfix
Как это оптимальнее всего спроектировать?

Без взгляда на проект в целом это довольно бессмысленный вопрос. Решений может быть множество, но если попытаться угадать.... я бы вообще разделил "обязательные по бизнес-логике внутренние поля" и "то, что показывается публике". То есть пусть будет таблица users, где эти поля обязательные, и будет таблица user_info, где пользователь отмечает только то, что хочет показать (в том числе, возможно, другой емейл, отличный от того, с которым он зарегистрирован в системе).
...
Рейтинг: 0 / 0
29.06.2021, 16:08
    #40080748
Elfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Кесарь, об этом и речь. Сервер должен в json не выводить поля, к которым пользователь не хочет давать доступ.
А клиент в свою очередь в браузере уже будет размещать на формах те значения, которые пришли с сервера.
Вопрос в том, как правильнее хранить эти поля в базе, чтобы серверу откуда-то читать предпочтения пользователя.

авторБез взгляда на проект в целом это довольно бессмысленный вопрос. Решений может быть множество, но если попытаться угадать.... я бы вообще разделил "обязательные по бизнес-логике внутренние поля" и "то, что показывается публике". То есть пусть будет таблица users, где эти поля обязательные, и будет таблица user_info, где пользователь отмечает только то, что хочет показать (в том числе, возможно, другой емейл, отличный от того, с которым он зарегистрирован в системе).Там смотреть не на что :) Одна таблица users. Я думаю это не очень хорошая идея дублировать информацию по одному и тому же пользователю.

По сути есть два пути:

1. В таблице users сделать еще поля с типом boolean, с префиксом hide.
2. Создать еще таблицу с вторичным ключом и перечислить наименования столбцов, доступ к которым запрещен.

Или есть еще какой-то способ?
По мне, первый метод очень перегружает таблицу, а второй серьезно усложняет работу с ней на сервере перед тем как отдавать json клиенту.

Что скажете?
...
Рейтинг: 0 / 0
29.06.2021, 18:14
    #40080778
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Elfix,

если вы не хотите делать широкую таблицу (хотя как её сильно уж расширят два битовых поля?), то можете вынести эти данные в отдельную таблицу и сделать связь один к одному.

User (ID ...)
UserInfo (ID, Email, EmailIsHide, Phone, PhoneIsHide)

и два покрывающих индекса по ней:
idx1 (ID, EmailIsHide) include (Email)
idx2 (ID, PhoneIsHide) include (Phone)

которые будете использовать примерно так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select
  u.ID,
  u. ...,
  im.Email,
  ip.Phone
from User u
  left join UserInfo im on im.ID = u.ID and im.EmailIsHide = 0
  left join UserInfo ip on ip.ID = u.ID and ip.PhoneIsHide = 0
...
Рейтинг: 0 / 0
29.06.2021, 21:00
    #40080802
Elfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Кесарь,

Проблема в том, что таких полей в таблице уже около 20 (телефон, почта, адрес, город и т. п.).
И добавление построчно этих полей в отдельную таблицу и многократное левое соединение кажется мне очень трудоемкой операцией в данном случае. Опять же, на форме я представляю себе, что пользователь вводит данные в поле и слева ставит галку "скрыть от посторонних". А значит при сохранении мне нужно будет обновить две таблицы одновременно, что тоже представляется мне не очень быстрой операцией...

Все же наверное придется пользоваться широкой таблицей для этого случая.
Или... а что если в поле phoneNumber например хранить json? В формате:

{
value: +790611455121
visibled: false
}

Или выборка и анализ в такой базе будет сильно усложнен?
Работаю в PostgreSQL.
...
Рейтинг: 0 / 0
29.06.2021, 22:46
    #40080817
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Поле типа int32 (или int64) с битовой маской для показа/скрытия
...
Рейтинг: 0 / 0
29.06.2021, 22:50
    #40080819
Elfix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
SERG1257
Поле типа int32 (или int64) с битовой маской для показа/скрытия
Не понял, можно подробнее?
...
Рейтинг: 0 / 0
29.06.2021, 23:54
    #40080826
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Elfix
Кесарь,

Проблема в том, что таких полей в таблице уже около 20 (телефон, почта, адрес, город и т. п.).
И добавление построчно этих полей в отдельную таблицу и многократное левое соединение кажется мне очень трудоемкой операцией в данном случае.


Ну так вы ж не сказали, что их уже 20-ть.

Вопрос, зачем и почему пользователю разрешено/предложено управлять видимостью на таком атомарном уровне?

показать/скрыть телефон, емейл, адрес (без разбиения) и всё, достаточно.

Что за задача такая?
...
Рейтинг: 0 / 0
30.06.2021, 00:32
    #40080828
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
ElfixНе понял, можно подробнее? https://ru.wikipedia.org/wiki/Битовая_маска
Одно поле int32 на все 20 полей (показывать или нет).
Также можно использовать массив битовых значений. https://www.postgresql.org/docs/current/arrays.html
Будет по сути тоже самое

Нарушение конечно первой нормальной формы.
...
Рейтинг: 0 / 0
30.06.2021, 13:33
    #40080920
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Elfix
Как это делают социальные сети обычно?


Социальные сети обычно эти данные не показывают по умолчанию, иначе бы в них никто не регистрировался,
за исключением тех сетей которые без этого не могут существовать (ватсап и т.д. без телефона не имеют смысла)...
С одной стороны при регистрации телефон и почта могут быть обязательными реквизитами.
С другой стороны, юзер при регистрации может указать способ обращения к нему других юзеров:
- никак
- только по почте
- только по телефону
- любым способом, только зарегистрированные
- только по почте не зарегистрированные
...
Для этого достаточно одного поля integer в таблице users, которое и заполняет юзер при регистрации и может потом изменить его как один из параметров личных данных.
Соответственно в интерфейсе от этого параметра и будет зависеть показ контактов для других юзеров,
json должен вытаскивать или реальные значения или показывать пустышку в зависимости от установленного юзером параметра...
Возможны случаи когда вопрос с контактами определяется на уровне Администратора сети, но и тогда
скорее всего будет кнопка "Написать" Юзеру (без разглашения почтового ящика) или
будет кнопка "Позвонить", только после нажатия на которую появиться телефон куда звонить...
Ну как бы по умолчанию показывать все контакты это только для внутренней сети нормально...
...
Рейтинг: 0 / 0
12.09.2021, 17:37
    #40096982
Bsplesk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Elfix,

Role-Based Access Control (RBAC) and Attribute-Based Access Control (ABAC).
Вам на сколько понимаю нужен ABAC
Вот здесь немного: https://habr.com/ru/company/custis/blog/248649/

Вообще посмотрите GraphQl+JWT готовые реализации.

Пример библиотечки https://casbin.org/docs/en/supported-models
...
Рейтинг: 0 / 0
12.09.2021, 18:48
    #40096994
Bsplesk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть поля в таблице users
Elfix,

Если у вас PostgreSQL, то возможно вам будет достаточно RLS, Row-Level Security
https://postgrespro.ru/docs/postgrespro/9.6/ddl-rowsecurity
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Скрыть поля в таблице users / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]