|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
stenford, кодогенерация ORM не идеальна и если на чем-то простеньком она существенно упрощает и удешевляет разработку, то на более-менее объемных или нагруженных решениях приходится идти на компромиссы и мало полагаться на ORM. И это не только про Linq, а в целом, т.к. я еще ни разу не видел кодогенерации, которая меня лично бы устроила. :) Впрочем то, что кодогенерация плоха, вовсе не значит, то программист напишет код лучше - проверено. Оптимальная стратегия ИМХО - реализация функционала, а затем рефакторинг и оптимизация, с периодической регрессией. * Чтобы понимать о проектах о который говорю, к примеру на прошлой работе это был MS Dynamics AX, но речь не только о ERP, а в целом. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 15:15 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
CawaSPb Кстати, будет ли именно в Вами используемом ORM такая конструкция оттранслирована в предикат на уровне SQL, или будет производиться пост-фильтрация на уровне приложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 15:18 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
kDnZP stenford, кодогенерация ORM не идеальна и если на чем-то простеньком она существенно упрощает и удешевляет разработку, то на более-менее объемных или нагруженных решениях приходится идти на компромиссы и мало полагаться на ORM. И это не только про Linq, а в целом, т.к. я еще ни разу не видел кодогенерации, которая меня лично бы устроила. :) Впрочем то, что кодогенерация плоха, вовсе не значит, то программист напишет код лучше - проверено. Оптимальная стратегия ИМХО - реализация функционала, а затем рефакторинг и оптимизация, с периодической регрессией. * Чтобы понимать о проектах о который говорю, к примеру на прошлой работе это был MS Dynamics AX, но речь не только о ERP, а в целом. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 15:22 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
stenford Megabyte Можно пример функционала, когда на сервере тысяча хранимок(для чего?), а на клиенте 1 метод? Мне просто сложно это представить... Обычно 1 метод на клиенте равен 1 хп на сервере. Кто вам мешает все вызовы в БД завернуть в один метод верхнего уровня, как вы сделали с клиентским кодом? С ОRM будет один метод DAL IQuerable GetClients(). Вызывающие подсистемы просто вызовут его как GetClients().Where(c => c.Name == 'Alex' && Surname == 'Ivanov'). Все остальное сделает ОRM. Теперь для следующей версии понадобится фильтр по наличию у клиента детей. Вы будете либо создавать новый DAL метод + новую хранимку, либо добавлять новый параметер с новым case'ом в существующую (и заодно перетестировать весь код что-бы убедится что ничего не сломалось). А мне в буквальном смысле слова не надо будет ничего делать. Подсистема просто вызовет мой метод как GetClients().Where(c => c.Kids > 0) А если разобрать другую ситуацию: таблица, например, 100млн транзакций. Будешь ли ты обращаться к ней по какому угодно фильтру то, на выбор: 1) будешь жрать ресурсы на скан таблицы и мешать другим пользователям, если не положишь систему в целом. 2) натыкаешь индексов на все возможные поля и поимеешь производительность на вставку\апдейт\удаление записи. И вот какой-то программист, который вдруг захочет по этой таблице отфильтровать по какому-то второстепенному полю, запустит внезапно скан всей таблицы, будет веселуха. С хп такой финт ушами не пройдет, надо будет сначала произвести доработку процы, внедрить параметр, или сделать новую процу. Но на сервере можно же и разграничить доступ в том числе и для программистов, чтоб не делали всякую хрень без проверки ДБА. :) Так-то у нас у разрабов у всех доступ, поэтому приходится их код постфактум оптимизировать. :) И поиск кода по хп проще и быстрее, чем по различным приложениям. p.s. На большие таблицы, с которыми работает много пользователей\приложений, должен быть строго регламентированный доступ. Иначе будет жопа. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:14 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
stenford CawaSPb Кстати, будет ли именно в Вами используемом ORM такая конструкция оттранслирована в предикат на уровне SQL, или будет производиться пост-фильтрация на уровне приложения? Это не всегда реализуемо (хотя и не всегда нужно), но всегда более громоздко. Большой плюс для разработки - нахождение в рамках одного языка и одной парадигмы программирования. Большой минус - в том же. Кстати, добавьте в условие не "количество детей", а "количество несовершеннолетних детей" (что, согласитесь, вполне обычное бизнес-условие), и жизнь заиграет новыми красками. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:24 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
Я в последнее время пришел к гибридному подходу. Для чтения данных ORM в большинстве случаев удобнее / проще, динамический поиск уже упоминали. А вот для сохранения данных, во избежание клиентских транзакций и шибко умных "оптимизаций" типа неожиданного кэширования / lazy write'a и проч., использую хранимки. Там можно и бизнес-правила быстро проверить, без перекачки данных туда-сюда, и какой надо try/catch написать, и TIL поменять, и хинты наложить, да все что угодно. В результате с одной стороны сильно сокращается количество хранимок, с другой - весь ответственный код по-прежнему в БД, где легко отследить все зависимости, сделать при необходимости рефакторинг и прочее. Еще бы они в EF нормальный интерфейс для вызова хранимок бы сделали, чтобы свои велосипеды не городить... эх. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:34 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
Ennor Tiegael Я в последнее время пришел к гибридному подходу. Для чтения данных ORM в большинстве случаев удобнее / проще, динамический поиск уже упоминали. А вот для сохранения данных, во избежание клиентских транзакций и шибко умных "оптимизаций" типа неожиданного кэширования / lazy write'a и проч., использую хранимки. Там можно и бизнес-правила быстро проверить, без перекачки данных туда-сюда, и какой надо try/catch написать, и TIL поменять, и хинты наложить, да все что угодно. В результате с одной стороны сильно сокращается количество хранимок, с другой - весь ответственный код по-прежнему в БД, где легко отследить все зависимости, сделать при необходимости рефакторинг и прочее. Еще бы они в EF нормальный интерфейс для вызова хранимок бы сделали, чтобы свои велосипеды не городить... эх. p.s. А то, да, это мы еще только про select говорили... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:41 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
982183 alexeyvg Когда приложение разрабатывается и поддерживается много лет, так что сменились несколько поколений разработчиков, если ни один разработчик не представляет, как работает весь код системы, потому что его много, и т.д. Когда ни один аналитик не представляет структуру данных всей системы. Отвечая только за её локальный модуль. Как же иначе, если она сложная? stenford Megabyte Планы будут одинаковыми может быть в 80% случаев, но остальные 20 вам сделают проблем намного больше. Кстати, в чем заключается лучшая поддерживаемость кода на клиенте? Только в том, что на фирме нет людей, хорошо знающих SQL, но знающих код клиента? p.s. тысяча хранимок - это плохо, если можно обойтись 100, но должным образом параметризированных. Но если функциональность разная, то какая разница, сколько хранимок? Вы же не предъявляете претензии к объему клиентского кода... Никаких проблем с планами не будет, а если и возникают - то решаются точно такими-же методами, как и при написании запросов вручную Вы представьте, что приложение, скажем, сервис на Java, будет разрабатывать SQL-разработчик. Он будет предлагать нечто абсурдно звучащее, типа "храним код процедуры в базе, локальные переменные методов в полях, ну, при событии строим класс и отправляем джава-машине, эмулируя одновременно изменение значений переменных в полях...". Вот для специалиста по реляционной алгебре, читать про ваши идеи моделирования операций реляционной алгебры на клиентском ЯП, сделав к базе только, по сути, интерфейс запроса отдельных записей, и надеясь, что ОРМ сам раскроет за вас бизнес-связь данных, и переделает ваше описание связей (на чуждом РСУБД языке) в язык запросов, так же странно, как вам читать про разработку Java-сервисов специалистом по СУБД. Вот в некоторых случаях это прокатывает, если модель данных простая, и данных немного. И даже если что то там не срастётся, то не проблема, тысечекратное падение производительности никому неважно - 1 мс, или 1с, какая разница... Но прокатывает не всегда. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 17:53 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
alexeyvg stenford Лучшая поддерживаемость заключается в том, что вместо тысяч хранимок с десятками параметров и 10-ти этажными case'ами (или вообще формирования динамического sql вручную и таинственных ошибок 'Invalid syntax near x symbol' в продакшене) у меня будет один единственный метод DAL'a IQuerable GetClients(), который разные методы будут вызывать с нужными параметрами и ОRM будет автоматически создавать правильный код. Никаких проблем с планами не будет, а если и возникают - то решаются точно такими-же методами, как и при написании запросов вручную ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 18:00 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
sti alexeyvg Я уверен, что нормальный SQL разработчик не спроектировал бы такую модель данных, и написал бы такой запрос. Зло ОРМ не в том, что там делается какой то кривой код условий запросов, например, с синтаксическими ошибками (с чего бы?), а в том, что разработчики не выделяют работу с данными как слой системы, требующий специалиста с соответствующей квалификацией. Поэтому получаются такие вот страшные поделия. Второй недостаток, вытекающий из первого - отсутствие отдельного слоя не позволяет полноценно контролировать работу с СУДБ, теми же самыми узкими специалистами. И если это прекрасно работает для приложения-записной книжки, то для более сложных и нагруженных систем будет проблемой, делая их неработоспособными в реальной жизни. Когда приложение разрабатывается и поддерживается много лет, так что сменились несколько поколений разработчиков, если ни один разработчик не представляет, как работает весь код системы, потому что его много, и т.д. stenford есть к примеру таблица с клиентами Client (Name, Surname, DOB и еще 20 полей). Одной подсистеме надо клиентов отбирать по имени + фамилии, другой - по дате рождения, третьей - по адресу. С хранимками у вас 2 варианта - иметь 3 хранимки (с такими замечательными именами как GetClientsByNameAndSurname), либо иметь одну хранимку с десятком параметров и лестницей из case'ов внутри (либо ручным динамическим sql). С ОRM будет один метод DAL IQuerable GetClients(). Вызывающие подсистемы просто вызовут его как GetClients().Where(c => c.Name == 'Alex' && Surname == 'Ivanov'). Все остальное сделает ОRM. ... А мне в буквальном смысле слова не надо будет ничего делать. Подсистема просто вызовет мой метод как GetClients().Where(c => c.Kids > 0) А иногда это нужно сделать, поменять модель данных. Или, например, сделать матвьюху, что бы запрос из таблицы на самом деле не обращался к таблице, а брал сохранённые агрегированные значения. Ну и делать тыщу процедур для поиска по имени, по имени и фамилии, и т.д., тоже не самая удачная идея. Для специалиста по Java или C++ такое решение очевидно, но не для специалиста по СУБД. Вы бы, проектируя классы на C#, сделали бы тыщу методов "с такими замечательными именами как GetClientsByNameAndSurname", или придумали бы что то получше? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 18:15 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
Фёдоров Sergunka большинство ДБА перешли либо в noSQL типо Кассандра, Биг Дата, МонгоДБ, Спарк и тд ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 18:49 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
gpu stenford да, ориентированные на данные системы действительно исключение. Там, где логика полностью завязана на данных, по определению нет никаких ORM, масса ad hoc запросов и отчетов - то такие системы жизнеспособны только с дба. Но их относительно немного, гораздо чаще под их видом предоставляют систему, написанную в стиле конца 90-х, с логикой в хранимках, триггерами и прочими "аттрибутами". К счастью этот кошмар остался в основном только в легаси ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:02 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
jbond81 gpu пропущено... Стесняюсь спросить, а в чем криминал в логике в хранимках? открыл хранимку внес изменения даже деплоить ничего не нужно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:14 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
Wizandr jbond81 пропущено... Стоимость внесения изменений стремится к бесконечности. открыл хранимку внес изменения даже деплоить ничего не нужно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:20 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
stenford CawaSPb Кстати, будет ли именно в Вами используемом ORM такая конструкция оттранслирована в предикат на уровне SQL, или будет производиться пост-фильтрация на уровне приложения? Код: C# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 22:40 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
Wizandr jbond81 пропущено... Стоимость внесения изменений стремится к бесконечности. открыл хранимку внес изменения даже деплоить ничего не нужно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 22:49 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
CawaSPb Кстати, добавьте в условие не "количество детей", а "количество несовершеннолетних детей" (что, согласитесь, вполне обычное бизнес-условие), и жизнь заиграет новыми красками. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 22:51 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
Megabyte А если разобрать другую ситуацию: таблица, например, 100млн транзакций. Будешь ли ты обращаться к ней по какому угодно фильтру то, на выбор: 1) будешь жрать ресурсы на скан таблицы и мешать другим пользователям, если не положишь систему в целом. 2) натыкаешь индексов на все возможные поля и поимеешь производительность на вставку\апдейт\удаление записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 22:54 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
yabs Megabyte А если разобрать другую ситуацию: таблица, например, 100млн транзакций. Будешь ли ты обращаться к ней по какому угодно фильтру то, на выбор: 1) будешь жрать ресурсы на скан таблицы и мешать другим пользователям, если не положишь систему в целом. 2) натыкаешь индексов на все возможные поля и поимеешь производительность на вставку\апдейт\удаление записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 23:02 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
Megabyte Когда клиентов в таблице 100-1000, то да, код ОРМ будет немного проще. Я согласен, что можно и ОРМ заюзать. А если разобрать другую ситуацию: таблица, например, 100млн транзакций. Будешь ли ты обращаться к ней по какому угодно фильтру то, на выбор: 1) будешь жрать ресурсы на скан таблицы и мешать другим пользователям, если не положишь систему в целом. 2) натыкаешь индексов на все возможные поля и поимеешь производительность на вставку\апдейт\удаление записи. И вот какой-то программист, который вдруг захочет по этой таблице отфильтровать по какому-то второстепенному полю, запустит внезапно скан всей таблицы, будет веселуха. С хп такой финт ушами не пройдет, надо будет сначала произвести доработку процы, внедрить параметр, или сделать новую процу. Но на сервере можно же и разграничить доступ в том числе и для программистов, чтоб не делали всякую хрень без проверки ДБА. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 02:20 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
CawaSPb Это, без всякого сомнения, правильно. Но при усложнении логики мы фактически получим реализацию SQL в выразительных средствах Host языка. Это не всегда реализуемо (хотя и не всегда нужно), но всегда более громоздко. Кстати, добавьте в условие не "количество детей", а "количество несовершеннолетних детей" (что, согласитесь, вполне обычное бизнес-условие), и жизнь заиграет новыми красками. Отчеты по-прежнему в хранимках ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 02:26 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
alexeyvg Вот для специалиста по реляционной алгебре, читать про ваши идеи моделирования операций реляционной алгебры на клиентском ЯП, сделав к базе только, по сути, интерфейс запроса отдельных записей, и надеясь, что ОРМ сам раскроет за вас бизнес-связь данных, и переделает ваше описание связей (на чуждом РСУБД языке) в язык запросов, так же странно, как вам читать про разработку Java-сервисов специалистом по СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 02:32 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
alexeyvg А иногда это нужно сделать, поменять модель данных. Или, например, сделать матвьюху, что бы запрос из таблицы на самом деле не обращался к таблице, а брал сохранённые агрегированные значения. alexeyvg Вы бы, проектируя классы на C#, сделали бы тыщу методов "с такими замечательными именами как GetClientsByNameAndSurname", или придумали бы что то получше? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 02:38 |
|
Что происходит на рынке DB вакансий в ЕС?
|
|||
---|---|---|---|
#18+
yabs Кстати да, когда нет возможности приложение в Любой момент пропатчить, то альтернативы хранимкам нет ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 02:53 |
|
|
start [/forum/topic.php?fid=7&msg=21633104&tid=1297162]: |
0ms |
get settings: |
17ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
32ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
472ms |
get tp. blocked users: |
0ms |
others: | 282ms |
total: | 815ms |
0 / 0 |