Pull to refresh
2
0
Виктор Езерский @Mapar

User

Send message

Хороший вопрос, правильный, для этого у Линстеда есть определение "транзакционного линка" (transaction link, т.е. линка у которого нет сроков действия), но поскольку мы не только про банк, то тут может быть понятие историчности, скажем, я наблюдал при реализации DV для крупного поставщика, когда строка в заказе без сторно "пропадала" задним числом в течении месяца, или появлялась новая строка. Или скажем менеджер по заказу менялся несколько раз, если есть хаб заказ и хаб сотрудние и линк менеджер по заказу, и тут надо поддерживать историчность для этого линка, т.е. если бы мы получили отчет с 5 по 10 сентября, то менеджер был бы один, а если 11 сентября то другой.

Вообще говоря, весь DV про то, чтобы получить отчет за август, как он выглядел 8 сентября, сегодня 16 октября, когда прошла масса изменений задним числом. Если нет изменений задним числом, и отчет нужен только как он выглядит сегодня, то DV вообще не нужен.

ER диаграмма ужасная, линии и объекты пересекаются и не видно, что от чего зависит.

Самое интересное в DV это линки, и по ним можно понять умеет автор в DV или нет. Любые транзакции, факты, проводки - это линк, а не хаб, в данной схеме h_order_detail - лишний, и должен быть линком.

Ну и тема историчности линков в статье не раскрыта, спойлер в самом линке не должно быть периода действия. Так же не раскрыта тема сателлита на линк.

Для какой модели данных? Камбал, Инмон, DataVault?

Собственно самое ценное, это коэффициенты по слоям, и они сильно должны зависеть от выбранного способа моделирования данных и от того сколько показателей нужно взять из исходных данных. Без них статья особого смысла не имеет.

Угу, такое у многих болит... я был по обе стороны баррикад и в целом разрыв очень большой, а как появились ORM стал вообще огромный

Основаная проблема с временными таблицами в PosgreSQL в том что это постоянное создание/удаление набора файлов, что достаточно дорого, и влияет на скорость. Скажем на том же PgConf про этот рассказывает каждый первый кто мигрует с Oracle или Ms Sql. Доходит до того, что народ делает не логируемую постоянную таблицу исполтзует ее как временнумю (заводит в ней поле с id временной сессии и асинхронной очисткой) и это бысттее.

Ну и да распухание pg_class.

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

Наверное хайп из-за кликбейтного заголовка.

В целом автор подсветил актуальную проблему: разделение и переход на 3х звенку и дальше микро сервисы выделил класс разработчиков которые работают с БД и при этом не умеют этого делать. Автор явно пишет:

приходится вносить изменения в код без полного понимания, надеясь, что всё заработает

при этом ссылаясь на:

Со временем, когда отцы-основатели данной хранимой процедуры покидают компанию, вместе с ними уходит и понимание того, как всё это должно функционировать. Новым сотрудникам, чтобы внести небольшие изменения, приходится собирать информацию по крупицам от тех, кто хоть как-то взаимодействовал с этим чудом инженерной мысли.

Но это касается любого кода. То же самое можно сказать о коде на С#, Java или Python, кто мешает в компании где работает автор, реализовать процессы документирования и сопровождения написанного кода, передачу знаний при увольнении и поддержания нужных компетенций?!

На мой взгляд проблема в другом, разработчики просто не умеют работать с БД, не могут прочитать код хранимой процедуры. Не владеют средствами отладки. Не владеют фреймворками БД для тестирования (а они есть). То что пишет автор про структуру серверов и не возможность тестирования кроме ничего боли и сочувствия из-за не правильной организации работы не вызывает. (разработчиков хранимых процедур легко можно изолировать теми же схемами и отдельными БД в PostgreSQL, чуть ли на каждом PgConf есть пару докладов про авторазвертывание копии БД для разработчика и тестов, я не говорю уже про CI/CD где можно просто еженощно проводить сборку и тестирование, и специфичные возможности отдельных СУБД)

К сожалению такой подход работы с БД встречается все чаще и чаще и если для фронтенда эта проблема решилась выделением отдельного класса разработчиков, никто же не говорит что функции в JS не нужны, то с другой стороны (БД) такого разделения не произошло или произошло не во многих компаниях, зачастую за разработку в БД и оптимизацию запросов отвечает DBA который НЕ РАЗРАБОТЧИК, если вообще выделеный DBA есть, а это не просто DevOps/сисадмин.

Что касается миграции - да это проблема, но с другой стороны не думайте, что если Вы в своем проекте не использовали хранимые процедуры - то перейдя на другую БД у Вас все будет хорошо. На проекте с БД в несколько десятков GiB да все будет ок. Но на других размерах у Вас будут проблемы, так как в разных БД по разному реализована изоляция записи и чтения, разная стоимость блокировок и транзакций, разная стоимость привычных Вам механизмов (например, в PostgreSQL гораздо медленнее временные таблицы чем в MS SQL или Oracle). Не говоря уже о других более мелких особенностях.

В итоге разработчик действительно либо не лезет в хранимки и делает все на том что он реально умеет и понимает, либо должен владеть БД так же, как своим основным языком разработки. Разделение я думаю тут проходит от нагрузки и размера БД.

С моей точки зрения, хранимки это инструмент который имеет право на жизнь и существенно облегчает работу с БД и повышает производительность, приведу несколько примеров:

  1. Пакетирование нескольких SQL, например, EL-T - гораздо выгоднее разработчикам пакетировать несколько SQL по осуществлению одной сложной трансформаций, чем корячится с этим в Airflow или NiFi, такой код логически скомпонован, более эффективен и легко читается, чем набор процессоров или DAG (или Python код с вызовом SQL)

  2. Работа с временными таблицами, с учетом, что временные таблицы живут в одной сессии, а трехзвенка использует connection pooling, то гарантировать выполнение последовательных SQL и жизнь временной таблицы проще в хранимке (естественно я знаю и другие способы, но так проще)

  3. Использование хранимых функций в запросах, например, функция дает остаток на счете на заданное время, а далее эти остатки агрегируются. Без такой логики вместо простого запроса нужно затащить всю эту логику и данные в уровень приложения и там делать агрегацию, либо писать монструозный запрос.

  4. Упрощение сложных запросов и разбиение их на части внутри хранимки (например, для стабилизации планов запросов), при этом хранимая функция может быть источником для других запросов. Т.е. select из хранимой функции

  5. Обеспечения единого API работы с БД если приложений работы с БД несколько, тут спорно и не микросервисно, но реализация в БД базовых примитивов, при том что с БД работает 10 разных сервисов может помочь, и я такие реализации видел

  6. Источник хранения и тестирования технологических скриптов, выполнение специфичных БД ориентированных действий - например, создание новых партиций по расписанию, перестроение индексов и т.п. Гораздо проще прямо иметь в БД проверенные и отлаженные процедуры, чем хранить SQL скрипты где то еще и путаться в их версиях.

Автор в любом случае молодец, что поднял такую больную тему, но все же рекомендую подняться чуть выше и понять, что каждый инструмент имеет смысл и свое назначение. Если в мире автора назначения инструменту нет, то не значит, что его нет совсем.

Народ, по телекам Samsung решение для tpws не нашлось?

Я пробовал направлять на фильтрацию 443 udp - помогло на 1 день, вчера с утра перестало работать, пробовал запрещать 443 udp - не помогло.

В итоге ПК и андроиде - все работает, телек - нет.

Оно вчера работало идеально, сегодня перестало. Тут еще вопрос какой телек и какой провайдер.

Я думаю DPI отличается от провайдера к провайдеру.

Логика простая:
$SCRIPT $ARGS -запускает демона который курочит пакеты на 999 порту

а далее делаете сколько надо iptables -t nat -A PREROUTING -i br0 что бы отправить трафик по нужным портам и протоколам на обработку

у демона можно настроить список того что он обрабатывает через --hostlist $HOSTLISTFILE" , остальной трафик пойдет без изменений

Кусок скрипта про запуск:

SCRIPT=/jffs/zapret/tpws
PIDFILE=/var/run/tpws.pid
HOSTLISTFILE=/jffs/zapret/hostlist.txt
ARGS="--daemon --bind-addr 192.168.1.1 --port 999 --disorder --tlsrec=sni --split-pos=2 --pidfile $PIDFILE --hostlist $HOSTLISTFILE"

start() {
if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE); then
echo 'Service TPWS is already running' >&2
return 1
fi
$SCRIPT $ARGS
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j REDIRECT --to-port 999
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j REDIRECT --to-port 999
iptables -t nat -A PREROUTING -i br0 -p udp --dport 443 -j REDIRECT --to-port 999

echo 'Started TPWS service'
}

iptables -t nat -A PREROUTING -i br0 -p udp --dport 443 -j REDIRECT --to-port 999

Неа, VPN и обход DPI лечат, значит - блокируют

Если настроить на хосты TCP и UDP :

googlevideo.com
youtube.com
youtu.be
ytimg.com
youtube-ui.l.google.com
ytimg.l.google.com
ytstatic.l.google.com
youtubei.googleapis.com

То на компе и на телефоне работает.

Опции: --disorder --tlsrec=sni --split-pos=2

Телевизор Samsung перестал работать (вчера работал с теми же опциями)

Тут скорее вопрос внешняя разработка или внутренняя. При внутренней - как Вы описали. При внешней скорее как в статье. Я бы не рискнул делать разработку на заказ, без подготовленных и согласованных заказчиком бизнес требований и технического задания и без документирования каждого шага. Иначе, потом сдавать заколеблешься.

У меня вопрос, как в анекдоте, а что в армии один солдат "бизнес-аналитик"?

Сам процесс построения описан корректно. Но где разделение по ролям? Где архитектор? Где системный аналитик?

Имхо, бизнес аналитик заканчивается на этапе информационного обследования и построение бизнес требований, а дальше дело архитектора, системных аналитиков и разработчиков.

Конечно, тут вопрос терминологии видов аналитиков, но как минимум архитектор должен быть на проекте точно.

Слишком поверхностно, новичок не поймет, так как не разжевано, а тем кто понимает и не надо.

Было бы не плохо:
1. привести сводную таблицу в которой видно различия в подходах
2. взять конкретный пример, и показать как он реализуется в разных подходах.

"Кроме того, объединение нескольких таблиц может приводить к блокировке большого объема данных на длительное время, что затруднит обновление данных другими операциями. "

Это что за такие блокировки? В Oracle читатели не блокируют никого.

Согласен со всеми предыдущими постами, дайте планы.

По факту в PL/SQL вариантами вы руками сделали Nested Loop, какие соединения в планах первых двух запросов.

И главное последний вариант:

where event_name = l_rec.event_name and (attribute_1 like '%XX_IF_ERRORS%' or attribute_1 is NULL)

второй вариант:

(upper(p.attribute_1) like '%' || t2.log_name || '%' or p.attribute_1 is NULL)

Т.е. upper есть в одном запросе и нет в другом, кроме того в первом запросе константа.

Итого: запросы не равнозначны, построен Nested Loop (на SQL это сделать можно, и непонятно почему не сделан), без планов статья смысла не имеет.

Information

Rating
Does not participate
Location
Россия
Registered
Activity