powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по организации "последнего экземпляра"
9 сообщений из 9, страница 1 из 1
Вопрос по организации "последнего экземпляра"
    #40041928
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день Товарищи!

У меня вопрос по тому, как лучше организовать в БД схему например с периодическими заполнениями анкет.
Т.е. имеются разные анкеты, в них какие-то там вопросы, и пользователь может анкеты заполнять раз в какой-то период. Т.е. например не чаще чем раз в 20 дней. В течение периода, это редактирование варианта анкеты который на данный период создан.

Как смог описал, вот схема примерная.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Anketa ( /* Сами виды разных анкет */
     id      SERIAL PK
)

AnketaInstance ( /* Экземпляр заполнения пользователем анкеты в период */
     id       SERIAL PK,
     aDate    DATE NOT NULL,
     userID   BIGINT UNSIGNED NOT NULL,
     anketaID BIGINT UNSIGNED NOT NULL, 
     isLast   TINYINT UNSIGNED NOT NULL, /* Флаг указывающий - что это последний вариант у анкеты пользователя */
     UNIQUE KEY (aDate, userID, anketaID),
)

//Ответы на экземпляры анкет уже связаны с AnketInstance(id)



aDate - это типа дата начала периода заполнения анкеты. Понимаю что правильно было бы сделать чтоб периоды шли один за другим вплотную (например как недели в году просто по номеру), но пользователь может анкету не трогать сколь угодно долго и потом начать заполнять и отсчёт периода должен идти от момента её заполнения.


Т.е. алгорит такой:
-----------------------------
- Пользователь открывает анкету для заполнения, для этого в БД получаем для данной анкеты и пользователя экземпляр с isLast=1,
- Если экземпляр не найден (значит вообще такую анкету пользователь ещё не заполнял) или у найденного aData<CURDATE-period (значит что окно периода для последнего экземпляра уже закончилось), то создаём новый экземпляр (aDate=CURDATE, isLast=1), а всем предыдущим с экземплярам этой анкеты у этого пользователя ставим isLast=0
- Если же экземпляр найден и aDate>=CURDATE-period, то значит это ещё открытая анкета которую можно править.


Ну и итоговые вопросы по этой схеме такие:
---------------------------------------------------------------
- Правилен ли вообще подход описанный мной и описанная схема БД для его реализации?
- В плане оптимальности, надо ли isLast делать индексом, или отбор последнего экземпляра лучше делать без isLast, а по выражению типа aDate<CURDATE-period?
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041937
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot
Правилен ли вообще подход описанный мной и описанная схема БД для его реализации?

Нет. По описанной схеме должно быть два поля даты - дата создания записи и дата последнего изменения анкеты. А поле isLast нафиг не нужно.

Типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE AnketaInstance ( /* Экземпляр заполнения пользователем анкеты в период */
     id         BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
     created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
     updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     userID     BIGINT UNSIGNED NOT NULL,
     anketaID   BIGINT UNSIGNED NOT NULL, 
     UNIQUE KEY (userID, anketaID, created_at)
)



Блокирование анкеты по истечение 20 дней - триггером.
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041942
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Акина, добрый день!

А дата последнего изменения анкеты для чего? Его где использовать вообще предполагается?

А блокирование анкеты по истечению условных 20 дней - триггером. Триггер на какое действие? И блокирование - это получается есть какое-то поле флаг блокировки типа isLocked которое по значению совпадает с !isLast.
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041944
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot
А дата последнего изменения анкеты для чего? Его где использовать вообще предполагается?
Для информации юзеру, сколько у него ещё осталось времени на редактирование анкеты.

kormot
Триггер на какое действие?
На обновление таблицы с ответами на анкету.

kormot
блокирование - это получается есть какое-то поле флаг блокировки типа isLocked которое по значению совпадает с !isLast.
нет. Просто если между текущей датой и датой создания анкеты более 20 дней, то SIGNAL SQLSTATE '45000'
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041952
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
создания анкеты более 20 дней, то SIGNAL SQLSTATE '45000'

Как мне научиться узнавать вот эти всякие примочечки - которые просто дают какой-то новый уровень возможностей? Где их разом прочитать все? Почему я раз в несколько лет на форуме задавая очередной тупой вопрос узнаю очередную порцию гениальных трюков?

Ну это лирика.

А как мне получается ссылаться на последний экземпляр анктеы? Т.е. в ответах на экземпляры анкет:
Код: sql
1.
2.
3.
4.
5.
6.
AnketInstance_Data (
    AInstanceID    BIGINT UNSIGNED,
    AQueryID       BIGINT UNSIGNED,
    data           CHAR(32),
    UNIQUE KEY     (AInstanceID, AQueryID)
)



Мне же для вставки данных получить ID последнего экземпляра анкеты? Это MAX'ом по дате делать? Не могу пока до конца вариант с началом и концом периода понять.

Вставку нового экземпляра я понял как с этим сигналом реализовать, но вот получать - то для последующих действий мне экземпляр анкеты в любом случае надо.
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041957
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPD: Я понял - у нас наверное вот в чём недопонимание. Ты Акина наверное видишь вариант что пользователь видит разные свои экземпляры анкет - заходит в них и блокировку редактирования анкеты можно реализовать SIGNAL'ом в триггере при попытке изменения данных в экземпляре.
А я предполагаю, что пользователь просто в анкету заходит (не в экземпляр а в сущность анкеты), и там у него либо набор уже накиданных в заполнение этой анкеты (экземпляра) за текущий активный период, если он ещё не окончен. Либо незаполненная если активного экземпляра данной анкеты сейчас нет и при попытке вставить данные - он соответственно создаётся.

Т.е. для отправки данных пользователь предоставляет не AInstanceID, AQueryID и data, а AnketaID, AQueryID и data. А вот получение из AnketaID AInstanceID - уже настороне приложения автоматом.
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041958
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot
Где их разом прочитать все?
dev.mysql.com/doc/refman/8.0/en/index.html

kormot
Мне же для вставки данных получить ID последнего экземпляра анкеты? Это MAX'ом по дате делать?
Вотще! ORDER BY updated_at DESC LIMIT 1
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041960
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot
у нас наверное вот в чём недопонимание. Ты Акина наверное видишь вариант что пользователь видит разные свои экземпляры анкет - заходит в них и блокировку редактирования анкеты можно реализовать SIGNAL'ом в триггере при попытке изменения данных в экземпляре.
А я предполагаю, что пользователь просто в анкету заходит (не в экземпляр а в сущность анкеты), и там у него либо набор уже накиданных в заполнение этой анкеты (экземпляра) за текущий активный период, если он ещё не окончен. Либо незаполненная если активного экземпляра данной анкеты сейчас нет и при попытке вставить данные - он соответственно создаётся.
Нет.

Во-первых, всё наоборот. Юзер входит на редактирование именно экземпляра. Нет сущности, есть паттерн (шаблон, по которому создаются инстансы, с вопросами) и экземпляр (конкретный инстанс, с датой создания, последнего редактирования и ответами).

Во-вторых, не влияет. Вернее, вообще не влияет. Какая в пень разница-то, видит юзер все свои анкеты или одну? по-любому он либо на редактирование может открыть лишь последнюю (а если она протухла - будет создана новая), старые он может только посмотреть (и либо редактирование вообще недоступно, либо при попытке сохранить вышеупомянутый триггер пошлёт в пень). Это ваша забота - давать юзеру возможность посмотреть, чё он там отвечал год назад, или обойдётся... и рулит этим уровень интерфейса, а не БД.
...
Рейтинг: 0 / 0
Вопрос по организации "последнего экземпляра"
    #40041971
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Да, описано всё так как я предполагаю. С интерфейсом и уровнем БД и приложения - это понятно, всё так и есть.
Про видимость анкет - это ненужно всё.

У меня просто непонимание того, что с полем-флагом я сразу предполагаю получать запросом весь набор данных:
Код: sql
1.
2.
3.
4.
5.
SELECT ДАННЫЕ_ШАБЛОНА_АНКЕТЫ
    UNION ALL
SELECT ДАННЫЕ_АКТИВНОГО_ЭКЗЕМПЛЯРА
 WHERE ЭКЗЕМПЛЯР.isLast=1 
   AND ЭКЗЕМПЛЯР.aDate>НИЖНЯЯ_ГРАНИЦА_ПЕРИОДА


Всё пока писал всё вроде встало на свои места.

Мне же условие
Код: sql
1.
    AND  ЭКЗЕМПЛЯР.aDate>НИЖНЯЯ_ГРАНИЦА_ПЕРИОДА


полностью обеспечивает выборку последнего экземпляра.

Да, спасибо за помощь!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по организации "последнего экземпляра"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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