Ответы пользователя по тегу Проектирование баз данных
  • Как лучше хранить настройки пользователей в БД?

    @DastiX
    Я в одном очень большом проекте подсмотрел классную фичу с "виртуальными столбцами", теперь очень часто пользуюсь в аналогичных, как у Вас случаях.

    Таблица концептов(concept):
    ID | NAME
    200 | Параметры отправки почты
    300 | Параметры отправки заданий
    ....

    Таблица параметров(param):
    ID | CONCEPT | NAME
    1 | 200 | Отправлять в пн
    2 | 200 | Отправлять во вт
    3 | 200 | Отправлять в ср
    ...
    10 | 300 | Отправлять задание 1
    11 | 300 | Отправлять задание 2
    12 | 300 | Отправлять задание 3
    ...

    Таблица Пользователей(users)
    ID | NAME
    1 | Саша
    2 | Петя
    3 | Вася
    ...
    Таблица реальных значений(xval)
    ID | CONCEPT | USR_ID | PARAM_ID | VALUE | ACTUAL
    1 | 200 | 1 | 1 | 1 | 1 | - Отправляем Саше по понедельникам почту
    2 | 200 | 1 | 2 | 1 | 1 | - Отправляем Саше по втоникам почту
    3 | 200 | 1 | 3 | 1 | 1 | - Отправляем Саше по средам почту
    4 | 200 | 2 | 3 | 1 | 1 | - Отправляем Пете по средам почту
    5 | 200 | 3 | 2 | 1 | 1 | - Отправляем Васе по вторникам почту
    ...
    20 | 300 | 1 | 10 | 1 | 1 | - Отправлять Саше задание 1
    21 | 300 | 1 | 11 | 1 | 1 | - Отправлять Саше задание 2
    22 | 300 | 1 | 12 | 1 | 1 | - Отправлять Саше задание 3
    23 | 300 | 2 | 11 | 1 | 1 | - Отправлять Пете задание 2
    23 | 300 | 3 | 10 | 1 | 1 | - Отправлять Васе задание 1
    Запрос
    select 
      u.name as usr,
      p.name as pname,
      x.value as val
    from users u 
    left join xval x on x.user_id = u.id and x.concept = 200
    left join param p on p.id = x.param_id
    where u.id = 1

    вернет вам все параметры отправки почты (concept=200) для Саши.
    USR | PNAME | VAL
    Саша | Отправлять в пн | 1
    Саша | Отправлять во вт | 1
    Саша | Отправлять в ср | 1
    Нужно узнать, какие конкретно отправлять задания?
    Просто меняете концепт на 300 и результатом будут все задания на отправку для Саши.

    Добавить какой-то параметр? Просто добавляете строку в таблицу и все!
    И никаких правок структуры в продакшене и другого геморроя.
    Ответ написан
    5 комментариев