|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Добрый день. Ткните пожалуйста меня носом - как сделать эту задачу красиво ? Роюсь уже 3 дня, хотя вроде на вид не шибко сложная.. 5. Покупатель имеет бонусную карту, привязанную только к его номеру телефона. Покупатель может заменить бонусную карту по причине утери, либо какой-то другой. При этом все данные со старой карты клонируются на новую, включая номер телефона, а старая очищается. После этого старая карта считается свободной для следующей выдачи либо замены (переноса данных). Поскольку покупатель всегда имеет право поменять номер телефона и перепривязать бонусную карту к нему, идентифицируем покупателя на текущий момент как владельца той или иной бонусной карты. Один покупатель не имеет права осуществлять более 5 переносов с карты на карту в год (@limit = 5). Есть процедура замены, получающая на вход два номера карты – текущий (@old_card) и новый (@new_card). Требуется написать скрипт для нее, определяющий, позволяется ли покупателю осуществить текущий перенос (достиг ли он лимита), если лимит достигнут, когда он сможет в следующий раз воспользоваться заменой карты. Есть таблица переносов c карты на карту: Table cards_transfer old_card new_card dt 111 555 2020-01-09 222 223 2020-02-10 333 334 2020-03-11 444 222 2020-04-12 555 666 2020-05-12 666 777 2020-06-13 777 888 2020-07-14 888 000 2020-08-15 999 333 2020-09-16 223 111 2020-10-16 Таким образом, согласно данным в примере, владелец карты 000 не может осуществлять замену карты до 09.01.2021. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 17:59 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
grabli092, копать надо в сторону "родители" и "рекурсия". Что-то вроде такого (код не мой, поэтому такой вид): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 18:18 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Кесарь, мне кажется я вроде понял, буду рыть тут.. спасибо в любом случае ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 18:25 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
grabli092 Кесарь, про "родителей" это в смысле ДНК ? )) или я не понял аллегорию ? насчет своего ДНК я и не обольщаюсь вовсе. Почему то всегда хожу самыми извилистыми путями и через заборы.. это у меня с рождения (( Где, где смайлик "рукалицо"??? grabli092, это профессиональный форум. Здесь выражаются не аллегорически. Если я сказал вам искать по словам "родители" и "рекурсия", то так и ищите. Не забудьте вначале написать "sql server". Если не нравится так, то ищите "обход дерева наследования". Но там будет больше не нужных вам вариантов... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 18:29 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Кесарь, нененене.. мне все нравится... мне просто нужен был пинок толчок в нужную сторону, я очень ценю помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 19:10 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
При фискированном уровне вложений можно сделать пять left join. Запрос будет проще, накосячить сложнее чем с рекурсией. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 19:58 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
SERG1257 При фискированном уровне вложений можно сделать пять left join. Запрос будет проще, накосячить сложнее чем с рекурсией. Задача не найти пять родителей, а найти того, у кого уже 5 или более (в любой системе бывают косяки, у кого-то может уже 6). И потом, если бизнес решит поменять кол-во смен карт за год, вы переписывать код будете? Нормальные программисты (инженеры) хранят бизнес-настройки в том или ином виде, доступном для редактирования пользователями бизнеса. И применяют эти настройки в коде в виде переменных. В результате чего почти никогда не требуется переделка кода при изменении параметров (остаток случаев запишем на снифинг). Если вы делаете не так, то переучивайтесь на нормальный способ ведения дел. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 11:35 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
SERG1257 При фискированном уровне вложений можно сделать пять left join. Кесарь Что-то вроде такого PS. А ещё в запрос следует добавить проверку, что переданный номер карты является конечным. А то так можно прийти с якобы утраченной ранее картой - и вот уже у тебя две бонусные карты. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 12:24 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Akina SERG1257 При фискированном уровне вложений можно сделать пять left join. Кесарь Что-то вроде такого Хотя тоже стратегия, особенно эффективна на самописных системах: всегда будет работа. Ведь столько нужно переделывать, а ты такой незаменимый... В предпенсионном возрасте особенно полезно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 12:28 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Кесарь SERG1257 При фискированном уровне вложений можно сделать пять left join. Запрос будет проще, накосячить сложнее чем с рекурсией. Задача не найти пять родителей, а найти того, у кого уже 5 или более (в любой системе бывают косяки, у кого-то может уже 6). Значит, нужно сделать 6 left join'ов И потом, если бизнес решит поменять кол-во смен карт за год, вы переписывать код будете? Нормальные программисты (инженеры) хранят бизнес-настройки в том или ином виде, доступном для редактирования пользователями бизнеса. И применяют эти настройки в коде в виде переменных. В результате чего почти никогда не требуется переделка кода при изменении параметров (остаток случаев запишем на снифинг). Если вы делаете не так, то переучивайтесь на нормальный способ ведения дел. Ага. Руками. Я не хочу сказать, что вариант с рекурсией - очень сложный, я бы тоже, например так и сделал. Но вызов подобного запроса обязательно должен предваряться либо проверкой хранящихся значений в таблице на наличие петель, либо с ограничением на глубину рекурсии. А кондовый способ с 6 лефт джойнами - ничего такого не требует. Он прост, как лом и такой же прочный и неломаемый. И, как показывает практика - чем проще, тупее и очевиднее код - тем лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 12:31 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Akina Кесарь Что-то вроде такого PS. А ещё в запрос следует добавить проверку, что переданный номер карты является конечным. А то так можно прийти с якобы утраченной ранее картой - и вот уже у тебя две бонусные карты. 1. Если рассматривать задачу узко, то да. А если заботится о системе в целом, то при получении значения N более 5-ти можно и нужно формировать сообщение об ошибке процесса и отсылать его через обмен в нужное место для разбора. 2. Вот тут не могу не согласиться! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 12:33 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
uaggster Кесарь пропущено... Задача не найти пять родителей, а найти того, у кого уже 5 или более (в любой системе бывают косяки, у кого-то может уже 6). Значит, нужно сделать 6 left join'ов И потом, если бизнес решит поменять кол-во смен карт за год, вы переписывать код будете? Ага. Руками. И, как показывает практика - чем проще, тупее и очевиднее код - тем лучше. Вы очень оригинально понимаете смысл автоматизации... Касательно проверок: само собой, я ведь не говорил, что мой код конечен. Это был пример куда копать, не более. Но он позволяет делать автоматизацию. А "лефт джойны в штуках" нет. В нормальной системе у менеджера есть возможность поменять значение параметра руками в клиенте. И это сразу и автоматически будет иметь силу. Без какой либо переделки в системе. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 12:39 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Кесарь Вы очень оригинально понимаете смысл автоматизации... Ага. Только не оригинально, а единственно правильное, я бы сказал. Программа, в идеале, должна а) Работать б) Быть обслуживаемой. Причем крайне желательно - программистом (джуниором) "с улицы", через 5 минут после вхождения в тему. Ergo - чем тупее и железобетоннее код - тем лучше. Программы пишутся для программистов, а не для компьютеров. Изящные, "конфигурируемые" и "свободно настраиваемые" и тому подобные решения - не работают от слова "совсем". Там, где можно обойтись ломом - там избыточен даже перфоратор. И да. Не нужно делать хорошо. Нужно делать - чтобы работало. Ударение на "работало". Касательно проверок: само собой, я ведь не говорил, что мой код конечен. Это был пример куда копать, не более. Но он позволяет делать автоматизацию. А "лефт джойны в штуках" нет. На самом деле - тоже позволяют. Надо сделать один join и While не более 6 раз или до получения пустого резалтсета. (я бы так не сделал (а сделал бы рекурсией), но это как раз было бы максимально устойчивым и при этом конфигурируемым решением). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 13:01 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Кесарь, Да, кстати, забыл "Касательно проверок". В абсолютном идеале - код не должен требовать проверок. "Проверка" - должна быть имманентна самому коду. Вот 6 лефт джойнов - не чувствительны к качеству данных и проверок на петли - не требуют. Совсем. Следовательно - в системе в принципе невозможны ошибки функционирования, связанные с а) качеством данных в системе (которые всегда говно, и по-другому не бывает) и с б) с реализацией самих проверок (которые пишутся людьми, у которых всегда руки не из того места, и по другому - тоже не бывает). Хотя я тоже выберу вариант с рекурсией. Он первым приходит на ум. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 13:07 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
Решение зависит от контекста задачи и контекста исполнения. При массовой обработке рекурсии могут сесть на попу, в этом случае джойны более выгодны. Если абонент меняет карту на карту по кругу, рекурсия сломается, а ему не запрещено это делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 13:27 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
uaggster Хотя я тоже выберу вариант с рекурсией. Он первым приходит на ум. :-) Задача ТС решается гораздо проще - дополнительный столбец, хранящий корневую карту для цепочки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 13:34 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
оО знакомое задание, не помню только в какой конторе оно было :( ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 13:38 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
invm uaggster Хотя я тоже выберу вариант с рекурсией. Он первым приходит на ум. :-) Задача ТС решается гораздо проще - дополнительный столбец, хранящий корневую карту для цепочки. Еще проще, оно решается наличием идентификатора клиента в этих бредовых данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 14:45 |
|
тестовая задача - с какой стороны рыть ?
|
|||
---|---|---|---|
#18+
aleks222 invm пропущено... Рекурсия почти всегда слишком дорогое удовольствие. Задача ТС решается гораздо проще - дополнительный столбец, хранящий корневую карту для цепочки. Еще проще, оно решается наличием идентификатора клиента в этих бредовых данных. Да он есть. Это номер телефона, как я понял. Просто нам привязку карты к телефону - не показали. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 14:54 |
|
|
start [/forum/topic.php?fid=46&fpage=22&tid=1684616]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 442ms |
0 / 0 |