|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
Добрый день Товарищи! У меня вопрос по тому, как лучше организовать в БД схему например с периодическими заполнениями анкет. Т.е. имеются разные анкеты, в них какие-то там вопросы, и пользователь может анкеты заполнять раз в какой-то период. Т.е. например не чаще чем раз в 20 дней. В течение периода, это редактирование варианта анкеты который на данный период создан. Как смог описал, вот схема примерная. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
aDate - это типа дата начала периода заполнения анкеты. Понимаю что правильно было бы сделать чтоб периоды шли один за другим вплотную (например как недели в году просто по номеру), но пользователь может анкету не трогать сколь угодно долго и потом начать заполнять и отсчёт периода должен идти от момента её заполнения. Т.е. алгорит такой: ----------------------------- - Пользователь открывает анкету для заполнения, для этого в БД получаем для данной анкеты и пользователя экземпляр с isLast=1, - Если экземпляр не найден (значит вообще такую анкету пользователь ещё не заполнял) или у найденного aData<CURDATE-period (значит что окно периода для последнего экземпляра уже закончилось), то создаём новый экземпляр (aDate=CURDATE, isLast=1), а всем предыдущим с экземплярам этой анкеты у этого пользователя ставим isLast=0 - Если же экземпляр найден и aDate>=CURDATE-period, то значит это ещё открытая анкета которую можно править. Ну и итоговые вопросы по этой схеме такие: --------------------------------------------------------------- - Правилен ли вообще подход описанный мной и описанная схема БД для его реализации? - В плане оптимальности, надо ли isLast делать индексом, или отбор последнего экземпляра лучше делать без isLast, а по выражению типа aDate<CURDATE-period? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 08:29 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
kormot Правилен ли вообще подход описанный мной и описанная схема БД для его реализации? Нет. По описанной схеме должно быть два поля даты - дата создания записи и дата последнего изменения анкеты. А поле isLast нафиг не нужно. Типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Блокирование анкеты по истечение 20 дней - триггером. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:16 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
Акина, добрый день! А дата последнего изменения анкеты для чего? Его где использовать вообще предполагается? А блокирование анкеты по истечению условных 20 дней - триггером. Триггер на какое действие? И блокирование - это получается есть какое-то поле флаг блокировки типа isLocked которое по значению совпадает с !isLast. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:30 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
kormot А дата последнего изменения анкеты для чего? Его где использовать вообще предполагается? kormot Триггер на какое действие? kormot блокирование - это получается есть какое-то поле флаг блокировки типа isLocked которое по значению совпадает с !isLast. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:34 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
Akina создания анкеты более 20 дней, то SIGNAL SQLSTATE '45000' Как мне научиться узнавать вот эти всякие примочечки - которые просто дают какой-то новый уровень возможностей? Где их разом прочитать все? Почему я раз в несколько лет на форуме задавая очередной тупой вопрос узнаю очередную порцию гениальных трюков? Ну это лирика. А как мне получается ссылаться на последний экземпляр анктеы? Т.е. в ответах на экземпляры анкет: Код: sql 1. 2. 3. 4. 5. 6.
Мне же для вставки данных получить ID последнего экземпляра анкеты? Это MAX'ом по дате делать? Не могу пока до конца вариант с началом и концом периода понять. Вставку нового экземпляра я понял как с этим сигналом реализовать, но вот получать - то для последующих действий мне экземпляр анкеты в любом случае надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:47 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
UPD: Я понял - у нас наверное вот в чём недопонимание. Ты Акина наверное видишь вариант что пользователь видит разные свои экземпляры анкет - заходит в них и блокировку редактирования анкеты можно реализовать SIGNAL'ом в триггере при попытке изменения данных в экземпляре. А я предполагаю, что пользователь просто в анкету заходит (не в экземпляр а в сущность анкеты), и там у него либо набор уже накиданных в заполнение этой анкеты (экземпляра) за текущий активный период, если он ещё не окончен. Либо незаполненная если активного экземпляра данной анкеты сейчас нет и при попытке вставить данные - он соответственно создаётся. Т.е. для отправки данных пользователь предоставляет не AInstanceID, AQueryID и data, а AnketaID, AQueryID и data. А вот получение из AnketaID AInstanceID - уже настороне приложения автоматом. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:59 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
kormot Где их разом прочитать все? kormot Мне же для вставки данных получить ID последнего экземпляра анкеты? Это MAX'ом по дате делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 10:00 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
kormot у нас наверное вот в чём недопонимание. Ты Акина наверное видишь вариант что пользователь видит разные свои экземпляры анкет - заходит в них и блокировку редактирования анкеты можно реализовать SIGNAL'ом в триггере при попытке изменения данных в экземпляре. А я предполагаю, что пользователь просто в анкету заходит (не в экземпляр а в сущность анкеты), и там у него либо набор уже накиданных в заполнение этой анкеты (экземпляра) за текущий активный период, если он ещё не окончен. Либо незаполненная если активного экземпляра данной анкеты сейчас нет и при попытке вставить данные - он соответственно создаётся. Во-первых, всё наоборот. Юзер входит на редактирование именно экземпляра. Нет сущности, есть паттерн (шаблон, по которому создаются инстансы, с вопросами) и экземпляр (конкретный инстанс, с датой создания, последнего редактирования и ответами). Во-вторых, не влияет. Вернее, вообще не влияет. Какая в пень разница-то, видит юзер все свои анкеты или одну? по-любому он либо на редактирование может открыть лишь последнюю (а если она протухла - будет создана новая), старые он может только посмотреть (и либо редактирование вообще недоступно, либо при попытке сохранить вышеупомянутый триггер пошлёт в пень). Это ваша забота - давать юзеру возможность посмотреть, чё он там отвечал год назад, или обойдётся... и рулит этим уровень интерфейса, а не БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 10:07 |
|
Вопрос по организации "последнего экземпляра"
|
|||
---|---|---|---|
#18+
Akina, Да, описано всё так как я предполагаю. С интерфейсом и уровнем БД и приложения - это понятно, всё так и есть. Про видимость анкет - это ненужно всё. У меня просто непонимание того, что с полем-флагом я сразу предполагаю получать запросом весь набор данных: Код: sql 1. 2. 3. 4. 5.
Всё пока писал всё вроде встало на свои места. Мне же условие Код: sql 1.
полностью обеспечивает выборку последнего экземпляра. Да, спасибо за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 10:21 |
|
|
start [/forum/topic.php?fid=47&msg=40041971&tid=1828194]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
158ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 268ms |
0 / 0 |