|
|
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Прошу знающих привести плюсы и минусы подхода к работе с таблицами БД (сейчас это FireBird, но светит переход на MSSQL2005) через хранимые процедуры. Довольно часто встречал сообщения что разработчики все изменения таблиц делают через хранимые процедуры. В чем плюсы и минусы такого похода Сам пока вижу следующие: - возможность стандартизации процессов редктирования, такие как доп. проверки, протоколирование А что еще? Ради чего стоит на каждую таблицу делать несколько процедур редактирования? чем-товедь этот подход оправдывается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 21:30 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Плюсы. ХП 1 раз компилятся, для их выполнения строится и сохраняется план, который используется при вызове ХП. В ХП можно использовать конструкции, которые не поддерживает обычный SQL. Минус. Привязка к СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 21:50 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
LelikBolekДовольно часто встречал сообщения что разработчики все изменения таблиц делают через хранимые процедуры. Эффект лемминга. Один сделал так, потому что в его ситуации это дает выигрыш, другой сделал так потому, что видел как делал первый, третий потому что читал, что это может дать выигрыш, четвертый потому что это красиво выглядит, а самое главное - в программу лепится еще один слой и можно с умным видом рассуждать об архитектурных достоинствах... LelikBolekА что еще? Ничего. Ни в одном обсуждении мне пока не попалось аргумента, который был бы одновременно достаточно универсальным и мало-мальски объективным (серьезнее уровня "я так привык и мне так нравится и вообще я об этом читал"). Все серьезные аргументы, которые я знаю, выглядят примерно так: в СУБД такой-то из-за такой-то особенности архитектуры вот здесь может быть выигрыш, а в СУБД такой-то такие-то фичи не реализованы и ХП является единственным вариантом решения вот этой задачи. Вот например вышеназванный "один раз компилятся". Очень популярная легенда, но мне до сих пор никто не назвал СУБД, для которой эта фраза подразумевает реальный выигрыш. Знакомый местным обитателям pkarklin в свое время объяснял мне это на материале MSSQL; в итоге той беседы некто Merle , также известная личность, показал, что даже для MSSQL все обстоит "не совсем так" и если мне не изменяет память (надо бы лезть в поиск) высказал мнение, что в MSSQL ХП в целом не эффективнее запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 22:45 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Чтобы избежать ненужного флейма, уточню формулировку. Фраза про "ХП один раз компилятся", сама по себе отчасти верная, почему-то превращена в легенду про "один раз компилящиеся ХП в силу этого имеют преимущество над прямыми запросами [которые, видимо, компилятся не один раз]". Именно вот такого эксперимента - выполняем тысячу раз ХП и вот вам офигенное преимущество над выполненным тысячу раз запросом - мне пока никто не показывал и не обосновывал. Хотя я готов поверить, что для одной-двух БД такой эффект и может существовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 23:05 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
MS SQL и для запросов планы кэширует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 08:50 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
LelikBolekПрошу знающих привести плюсы и минусы подхода к работе с таблицами БД через хранимые процедуры. Ключевое слово - процедуры, т.е. отдельные подпрограммы. А хранимые они или нет - это вопрос их физического размещения и исполнения (может не совпадать). Выделять в поцедуры и функции полезно все, не только работу с таблицами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 09:33 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Выполнение скомпилированного кода эффективнее изначально, по самой его природе, и не только для sql. Интерпретация предполагает все с самого начала: синтаксический анализ и т.д. и т.п.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 09:38 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
модВыделять в поцедуры и функции полезно все Слишком глобальное утверждение, чтобы быть всегда и безоговорочно верным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 10:49 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
2softwarer А как насчет, например, удаления и (или) изменение данных только за текущий месяц? И данных за месяц накапливается много и надо удалить например всЁ за этот месяц, как быть? Или, чтобы юзер не имел прямого доступа к таблицам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 11:01 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
basА как насчет, например, удаления и (или) изменение данных только за текущий месяц? И данных за месяц накапливается много и надо удалить например всЁ за этот месяц, как быть? Признаться, не понял вопроса. Если нужна операция "удаление всех данных за текущий месяц", скорее всего ее стоит оформить процедурой. basИли, чтобы юзер не имел прямого доступа к таблицам? Легко делается без единой ХП. Стоит отметить, что сама постановка вопроса "юзер не имел прямого доступа к таблицам" - кривое решение, пытающееся закрыть проблемы дизайна. Это решение лишь на шаг лучше столь же популярного "юзер вообще не имеет права логиниться на сервер". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 12:15 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
в общем видима подход типа даешь каждой таблице по 2 ХП (встака, удаление) не есь гуд.. значит как работали с FireBird через FibDataSet и SQLInsert, SQLUpdate и т.д. по аналогии нуно и с ADO (для MSSQL2005) тот же путь оптимальнее ... (понятно что это не всегда и не на 100%, я говорю об общем подходе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 13:46 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Одна из наиболее весомых причин применения сабжа - безопасность. Но я не очень представляю такую систему с 1000таблиц (реальная ситуация). Это же сколько надо процедур ????!!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 14:28 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
LSVОдна из наиболее весомых причин применения сабжа - безопасность. Хм. LSVНо я не очень представляю такую систему с 1000таблиц (реальная ситуация). Это же сколько надо процедур ????!!!!!! В моем случае на примерно 1500 таблиц приходилось около 300'000 строк серверного кода. Сколько это "в процедурах" не могу сказать. Пакетов было.. опять же затруднюсь сказать, что-то между несколькими десятками и до пары сотен по субъективным ощущениям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 15:11 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Когда таблиц очень много, есть смысл думать о среднем слое, метаданных и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 15:33 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
gybsonКогда таблиц очень много, есть смысл думать о среднем слое, ... И прелестях работы с 2*N объектами как альтернативе работы с N объектами... gybsonметаданных "Думать"? Они уже есть - select в руки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 16:10 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
LelikBolekРади чего стоит на каждую таблицу делать несколько процедур редактирования? чем-товедь этот подход оправдывается?Это более технологично - используется однообразный подход к редактированию данных. В качестве бонуса получаем АPI нашего приложения в виде набора хранимых процедур. softwarerЭффект лемминга. Правильно ли я понимаю Вашу позицию - в системе существует некое количество (часто весьма большое) тривиальных справочников, для которых хранить и вызывать процедуры вставки/удаления/редактирования нецелесообразно? sqllexМинус. Привязка к СУБД.Редактирование без использования хранимых процедур, IMHO, привязывает к СУБД еще сильнее :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 17:11 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
PL99Это более технологично - используется однообразный подход к редактированию данных. То есть другой столь же однообразный подход менее технологичен? Впрочем, тут более интересен вечный конфликт-компромисс между технологичностью единообразия и нетехнологичностью выбора не лучшего инструмента для конкретного случая. PL99Правильно ли я понимаю Вашу позицию - в системе существует некое количество (часто весьма большое) тривиальных справочников, для которых хранить и вызывать процедуры вставки/удаления/редактирования нецелесообразно? Хм. Если говорить о моей позиции в целом, то детально формулировать ее будет несколько громоздко, поэтому тезисно: 1. Я полагаю правильным "не плодить сущности без необходимости", а также уверен, что качество системы обратно пропорционально количеству тупого (dumb) кода в ней. 2. Я полагаю, что выбор оптимального решения - не такая простая тема; не слишком формализуемая и определенно не подходящая для рассуждений на пальцах. 3. Я уверен, что неудачное проектирование взаимодействия сервера с клиентом крайне негативно сказывается на качестве системы, на ее основных параметрах: функциональности, эффективности, сопровождаемости. PL99Редактирование без использования хранимых процедур, IMHO, привязывает к СУБД еще сильнее :-) Согласен. Если хочется сделать кросссерверное решение, "целиком процедурное API" является довольно привлекательным подходом (разумеется, не для всех задач, но для тех, которые в целом допускают такое решение). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 18:59 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
LSVНо я не очень представляю такую систему с 1000таблиц (реальная ситуация). Это же сколько надо процедур ????!!!!!! Как говорится, спецально посмотрел, 361 таблица, 5162 процедуры ;) Правда стоит заметить что процедуры не только ins/del но и вся бизнес логика проведения-отмены документов и все селекты на клиента. softwarer LSVОдна из наиболее весомых причин применения сабжа - безопасность. Хм. Именно без всякого "Хм". Одна из задач которые практически невозможно решить с помощью вьюшек это row-level безопасность. softwarerФраза про "ХП один раз компилятся", сама по себе отчасти верная, почему-то превращена в легенду про "один раз компилящиеся ХП в силу этого имеют преимущество над прямыми запросами [которые, видимо, компилятся не один раз]". Именно вот такого эксперимента - выполняем тысячу раз ХП и вот вам офигенное преимущество над выполненным тысячу раз запросом - мне пока никто не показывал и не обосновывал. Лично проводил данный эксперимент еще на 9-ке (по моему она была в 1997 году) Sybase. Необходимо было выбрать часть документов из большой таблицы с привязанными еще десятком таблиц с фильтрацией по 10 полям. Причем часть условий мога быть задана а часть, нет. Вообщем стандартная задача документооборота. Рассматривались варианты: 1)Создать вьюшку с запросом и динамически создавать WHERE выражение при каждой фильтрации в зависимости от введенных пользователем данных. SELECT ... Код: plaintext 1. 2. 3. 2) создать процедуру с 10 аргументами, селектом и условием типа Код: plaintext 1. 2. 3. 4. 5. Соответственно результатом данного эксперимента было 1-ый вариант 10 секунд (если мне пямять не изменяет) 2-вариант 11 секунд - первый запуск, менее 1 секунды каждый последующий Правда прошло уже почти 10 лет, последнее время я больше использовал MS SQL. Но не думаю что что-то сильно изменилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 16:20 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Estets softwarer LSVОдна из наиболее весомых причин применения сабжа - безопасность. Хм. Именно без всякого "Хм". Одна из задач которые практически невозможно решить с помощью вьюшек это row-level безопасность.softwarer, вероятно, имел ввиду Fine-Grained Access Control в Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 17:25 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
EstetsИменно без всякого "Хм". Одна из задач которые практически невозможно решить с помощью вьюшек это row-level безопасность. Именно с хм. softwarerФраза про "ХП один раз компилятся", сама по себе отчасти верная, почему-то превращена в легенду про "один раз компилящиеся ХП в силу этого имеют преимущество над прямыми запросами [которые, видимо, компилятся не один раз]". Именно вот такого эксперимента - выполняем тысячу раз ХП и вот вам офигенное преимущество над выполненным тысячу раз запросом - мне пока никто не показывал и не обосновывал. EstetsЛично проводил данный эксперимент еще на 9-ке (по моему она была в 1997 Соответственно результатом данного эксперимента было 1-ый вариант 10 секунд (если мне пямять не изменяет) 2-вариант 11 секунд - первый запуск, менее 1 секунды каждый последующий Правда прошло уже почти 10 лет, последнее время я больше использовал MS SQL. Но не думаю что что-то сильно изменилось. Удручающая картина. Надеюсь, кто-нибудь из местных Sybase-овцев расскажет, действительно ли все так плохо. Впрочем, в нарисованной Вами постановке не раскрыт один принципиальный вопрос. В первом варианте 10 секунд - это время первого запуска или время любого из последующих? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 17:51 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerУдручающая картина. Надеюсь, кто-нибудь из местных Sybase-овцев расскажет, действительно ли все так плохо. Впрочем, в нарисованной Вами постановке не раскрыт один принципиальный вопрос. В первом варианте 10 секунд - это время первого запуска или время любого из последующих? Именно что "любого из последующих" ;( Может сейчас Sybase и ускорил построение планов, и соответственно разница будет не столь заметная, но что было то было. softwarerИменно с хм. Что касается хм, то тут мне сказать нечего, скажем каждый остался при своем мнении. На счет вставки-изменения-удаления, только через процедуры, спорить даже не буду, так как считаю что невозможно только с помощью триггеров обеспечить большинство бизнес требований по верефикации вводимых-удаляемых данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 15:02 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
EstetsИменно что "любого из последующих" ;( То есть Вы хотите сказать, что в Sybase принципиально отсутствует кэш планов? Тогда понятно, почему в этом случае процедуры лучше. Хотя готов подсказать решение "как сделать так, чтобы вышеописанные запросы стали выполняться за 0.1 секунды, в то время как процедура будет продолжать ковыряться по секунде на вызов" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 15:23 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
EstetsЧто касается хм, то тут мне сказать нечего, скажем каждый остался при своем мнении. Я тут могу воспользоваться популярным дискуссионным приемом и кивнуть в сторону OEBS. ХП как средство возврата датасетов там практически не используются (не буду говорить "вообще не используются", поскольку для такого проекта очень трудно утверждать с уверенностью), с row-level security проблем не наблюдается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 15:48 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer EstetsИменно что "любого из последующих" ;( То есть Вы хотите сказать, что в Sybase принципиально отсутствует кэш планов? Тогда понятно, почему в этом случае процедуры лучше. Эээээ я этого не говорил ;) Когда выше я описывал пример то прозвучало "Создать вьюшку с запросом и динамически создавать WHERE выражение" а вот в данном случае действительно кэш планов помочь не может, т.к. SELECT ... WHERE doc_date < '20010101' и SELECT ... WHERE doc_date < '20020304' разные селекты. С OEBS не сталкивался, но работал например с Axapt-ой и сервер приложений прекрасно справляется с row-level security, но все таки сложность написания и поддержки 3-его уровня на мой вглад несколько больше чем, обернуть DML в конструкцию CREATE PROCEDURE AS... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 17:12 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Странно, что скорости тут сравнивают. Интересно, как может повлиять разница кешированного и не кэшированного планов запросов на обновление одной записи с учетом того, что это обновление вызывает клиентское приложение, то есть информацию вводит оператор. Какая может быть скорость ввода у оператора, чтобы стал критичным момент кэширования запросов, да еще с WHERE по PK ??? Моя не понимай По делу - лично я предпочитаю весь основной показ и изменение информации проводить через представления. Удобно с точки зрения защиты от прямого доступа к таблицам, можно спокойно ограничивать выбор информации нужными условиями, если сервер позволяет в представлении еще использовать UDF, вообще замечательно. Плюс можно ввести дополнительную защиту на проверку изменения информации (для ASA к примеру это WITH CHECK OPTION), которая гарантирует, что представление не даст через себя изменить или добавить информацию, не подходящую под условия, заданные в представлении. Зато как плюс - это полноценный SQL к доступу представления вместо убого вызова процедуры с параметрами (легче сгенерировать UPDATE на одно изменившееся поле, чем через процедуру принудительно обновлять все поля). Если же логика получения информации или сохранения изменений требует от клиентского приложения множества сложных действий, то я пишу хранимые процедуры. Бывают ситуации, когда к примеру приложение получает данные через хранимку, а изменение информации проводит по представлению или наоборот. Так же к примеру получение и изменение информации я провожу исключительно только через хранимые процедуры для вебовских приложений с учетом того, что вводятся множество других параметров и условий, которые было бы не выгодно выносить на логику веб приложения, усложняя его. Как итог хочу сказать, что нельзя в СУБД вырабатывать какие то догмы и тупо всегда ими пользоваться. Лучше вырабатывать гибкие стандарты и пользоваться ими с учетом поставленной задачи. Здесь лично я вижу смысл все писать через ХП только при условии, что платформа создания клиентских приложений не позволяет полноценно обеспечить проведение обновлений представлений и имеет множество ограничений. -- www.rusug.ru - портал русскоязычной группы пользователей Sybase ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 17:39 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Estetsа вот в данном случае действительно кэш планов помочь не может, т.к. SELECT ... WHERE doc_date < '20010101' и SELECT ... WHERE doc_date < '20020304' разные селекты. Хм. Во-первых, select ... where doc_date < :date и select ... where doc_date < :date - это вовсе не разные, а совсем даже одинаковые селекты, и кэш планов отлично поможет. Если программист пишет программу так, что убивает кэш - это проблема программиста, и она никак не означает "надо работать процедурами". Во-вторых, не знаю как в Sybase, а относительно MSSQL Merle рассказывал мне, что сервер ведет себя примерно как Oracle в режиме cursor_sharing = force, то есть: получая указанные Вами два запроса, параметризирует их и использует для них общий план, который строит один раз. Там были свои тонкости, но в первом приближении именно так. EstetsС OEBS не сталкивался, но работал например с Axapt-ой и сервер приложений прекрасно справляется с row-level security, но все таки сложность написания и поддержки 3-его уровня на мой вглад несколько больше чем, обернуть DML в конструкцию CREATE PROCEDURE AS... При чем тут сервер приложений? Откуда Вы его придумали и какое отношение он имеет к row-level security в OEBS? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 18:40 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
ASCRUS В целом - совершенно согласен. Единственно, отметил бы, что и вьюшки нужны далеко не всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 18:43 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Еще пять копеек в пользу хранимых процедур: + одна хп может выполнять отдельную бизнес-операцию (~Договор.Сохранение например, может включать в себя изменения порядка нескольких тысяч строк в нескольких десятках таблиц). + хп служит для информации о доступных действиях в базе (точно так же как пункты меню "рассказывают" о доступных операциях в приложении) + sql-код может оказаться удобнее размещать в хп, а не на клиенте Через некоторое время может потребоваться, например, вертикально разбить таблицу на две - не хочется из-за этого править клиента. + имея на сервере код хранимых процедур, можно выяснить все использования всех объектов тогда фраза "я не знал, что это поле кто-то использует, когда менял его" станет значительно более редкой. + все же, в большинстве случаев, быстрее выполнить одну хп с одним "большим" xml-параметром для сохранения документа, чем вызывать несколько тысяч отдельных sql-запросов, раскладывающих данные в разные таблицы + хранимая процедура может поймать и обработать исключение , чтобы кинуть наверх клиенту обработанное на сервере сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 19:23 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv + sql-код может оказаться удобнее размещать в хп, а не на клиенте Впрочем, в половине случаев будет удобнее строго наоборот. Например, вечная боль с попытками совместить хп с пользовательскими фильтрами и сортировками. igorolv + имея на сервере код хранимых процедур, можно выяснить все использования всех объектов Как минимум это не есть правда благодаря существованию динамического sql. Если же чуть подумать, окажется, что разницы никакой - на самом деле "все использования всех объектов" в любом случае нужно выяснять в некотором заранее определенном списке мест. Что это за список - код хранимок ли, код клиента ли, конфигурационные таблицы с динамическим кодом - разницы вообще говоря нет. igorolvтогда фраза "я не знал, что это поле кто-то использует, когда менял его" станет значительно более редкой. Хм. При минимально нормальной разработке она и так не возникает. Правду сказать, я даже не припомню, слышал ли ее иначе чем в подобных дискуссиях, и если слышал, то когда. igorolv + все же, в большинстве случаев, быстрее выполнить одну хп с одним "большим" xml-параметром Жуть. Писать код, которй складывает "большой xml-параметр" только ради того, чтобы кто-то другой писал код, который будет его парсить. Замечательный пример создания сильной статически непроверяемой связи на пустом месте. igorolvдля сохранения документа, чем вызывать несколько тысяч отдельных sql-запросов, раскладывающих данные в разные таблицы Хм. Любопытно, с какой стати несколько тысяч отдельных запросов плюс собирание xml плюс парсинг xml плюс логика выбора окажутся быстрее, нежели просто несколько тысяч отдельных запросов. Особенно если учесть возможности оптимизации, доступные при прямой работе. igorolv + хранимая процедура может поймать и обработать исключение , чтобы кинуть наверх клиенту обработанное на сервере сообщение. Может. Впрочем, никто не мешает коду исполняемому с клиента сделать в точности то же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 23:05 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Например, вечная боль с попытками совместить хп с пользовательскими фильтрами и сортировками. Есть такой момент. Однако, с фильтрами можно поступить и так: X.ID = @ID or @ID is null (набор необязательных входных параметров). С сортировками - либо case + order by, либо пусть этой задачей занимается клиент. Более того, с фильтрами становится все даже еще сложнее, особенно если число способов отфильтровать таблицу "сложным образом" куда больше, чем полей в таблице... Или "фильтрация" представляет собой довольно сложный запрос... Однако это все решаемо. Как минимум это не есть правда благодаря существованию динамического sql. Если же чуть подумать, окажется, что разницы никакой - на самом деле "все использования всех объектов" в любом случае нужно выяснять в некотором заранее определенном списке мест. а как это сделать, если динамический sql формируется из кода, вот таким вот образом ..."where {0}.{1}", @TABLE_NAME, @FIELD_NAME"... (да, при нормальной разработке такого нету, но все же бывает...). А мне, например, понадобилось переименовать поле - так я обойду все хранимки и поправлю NEW_NAME as OLD_NAME, а в клиентский код - меня не пустят. Жуть. Писать код, которй складывает "большой xml-параметр" только ради того, чтобы кто-то другой писал код, который будет его парсить. Замечательный пример создания сильной статически непроверяемой связи на пустом месте. складывающий код уже написан Microsoft. это Dataset.GetChanges(). парсить его - это openxml - сгенерировать автоматически парсящий код придется только один раз. выяснять в некотором заранее определенном списке мест. Что это за список - код хранимок ли, код клиента ли, конфигурационные таблицы с динамическим кодом - разницы вообще говоря нет. авторХм. При минимально нормальной разработке она и так не возникает. Правду сказать, я даже не припомню, слышал ли ее иначе чем в подобных дискуссиях, и если слышал, то когда. Не всегда разработка бывает "нормальной", как и архитектура приложения, к сожалению. Система может ведь очень долго эксплуатироваться. И если авторов динамического sql-а, вызываемого из кода уже нету - а поддерживать систему надо - с динамическим sql-ом могут быть неприятные сюрпризы... В общем слышал я эту фразу неоднократно, причем иногда в контексте "кто пил из моей кружки?!!!". Иногда процесс разработки "унаследован" и уже далеко не "нормальный", увы... Хм. Любопытно, с какой стати несколько тысяч отдельных запросов плюс собирание xml плюс парсинг xml плюс логика выбора окажутся быстрее, нежели просто несколько тысяч отдельных запросов. Особенно если учесть возможности оптимизации, доступные при прямой работе. Возможно, я недостаточно четко пояснил... ОДИН РАЗ собирание xml на клиенте + ОДНА процедура + ОДИН ее вызов на сервере + openxml на сервере будет работать быстрее ЧЕМ несколько тысяч отдельных запросов на сервер. Почти всегда (главное, не собирать на клиенте xml-ку обработкой строк :)). авторМожет. Впрочем, никто не мешает коду исполняемому с клиента сделать в точности то же самое. проблема в том, что имеется несколько разных клиентских приложений. Не считая уже большого числа пользователей-программистов, предпочитающих общаться с сервером из Management Studio. В общем, и динамический sql и хранимые процедуры имеют как свои плюсы, так и минусы. А что выбрать - зависит от специфики проекта. В нашем случае выгоднее оказались хранимые процедуры. В другом случае - динамический sql. Просто добавил несколько аргументов в пользу хранимок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2006, 02:01 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolvЕще пять копеек в пользу хранимых процедур Понял свою ошибку. Не пояснил про СУБД. Для SQL Server аргументация. В Oracle, как раз, выбор хранимки vs динамический sql - действительно, вопрос. softwarer - Ну нету у нас, разработчиков SQL Server, например, bind-переменных. Много чего нету, чего у Oracle есть. Поэтому нам приходится пользоваться тем, что есть. А есть хранимые процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2006, 02:12 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolvОднако, с фильтрами можно поступить и так В целом это и есть то, что я назвал "вечная боль". Уродливые неоптимальные запросы, ограниченные функционально фильтры, в целом - решения, по цена/качество рядом не стоящие с обычным запросом. Можно, конечно, но..... Например, в одной из относительно недавних дискуссий я сказал собеседнику, что могу вставить мастер-детальные данные единственным sql-оператором (речь шла о создании накладной с позициями, кажется). Могу. Даже двумя способами. Но я вряд ли буду так делать в нормальной системе. igorolvлибо пусть этой задачей занимается клиент. Хм. Ну это уже капитуляция. Этак весь серверный функционал можно сгрузить на клиента. А с сортировкой опять же - по одному полю еще можно, хотя кривовато, а если хочется по нескольким? Тогда совсем ужасно. igorolvа как это сделать, если динамический sql формируется из кода, вот таким вот образом ..."where {0}.{1}", @TABLE_NAME, @FIELD_NAME"... (да, при нормальной разработке такого нету, но все же бывает...). Бывает, и при нормальной разработке. Пусть формируется. Главное - данные из него не берутся из воздуха, они где-то хранятся, либо как константы в программном коде, либо как данные в конфигурационных таблицах. Значит - можно найти, главное знать, где искать. igorolvА мне, например, понадобилось переименовать поле - так я обойду все хранимки и поправлю NEW_NAME as OLD_NAME, а в клиентский код - меня не пустят. Сомнительно, что не пустят, но если так, это будет большой глупостью. Подобные коллизии существенно ухудшают качество приложения. igorolvскладывающий код уже написан Microsoft. это Dataset.GetChanges(). парсить его - это openxml - сгенерировать автоматически парсящий код придется только один раз. Во-первых, в "один раз" я не верю. Придется постоянно следить, чтобы он был согласован с клиентским датасетом. Во-вторых... ладно, не буду высказываться на тему автоматической генерации кода; в случае MSSQL альтернатив к сожалению скорее нет. igorolvНе всегда разработка бывает "нормальной", как и архитектура приложения, к сожалению. Я сказал "минимально нормальной" именно с учетом этого соображения. Я не назову все проекты и все коллективы, в которых работал, образцовыми, но описанная Вами коллизия - это уже полный бардак. igorolvВозможно, я недостаточно четко пояснил... ОДИН РАЗ собирание xml на клиенте + ОДНА процедура + ОДИН ее вызов на сервере + openxml на сервере будет работать быстрее ЧЕМ несколько тысяч отдельных запросов на сервер. А кто мешает ОДИН РАЗ передать на сервер скрипт из нескольких тысяч запросов? Это определенно будет работать не дольше, нежели ОДНА процедура, выполняющая внутри себя несколько тысяч отдельных запросов. Возможно, я Вас не понимаю из-за незнания, что такое openxml. Впрочем, никто не мешает мне выполнить с клиента array dml. То есть передать на сервер один оператор insert..values и несколько тысяч строк данных, которые должны через него пройти. Это намного быстрее, чем выполнять несколько тысяч insert поотдельности. igorolvпроблема в том, что имеется несколько разных клиентских приложений. Несколько разных клиентских приложений, входящих в один программный комплекс, имеют полную возможность пользоваться общими библиотеками. Соответственно, для них нет разницы, вызвать ли общую хранимку или общую функцию из dll-ки. Что касается нескольких полностью независимых клиентских приложений, авторства разных групп разработчиков итп, то я не встречал случая, чтобы они активно пользовались общим ХП-api. Максимум, такое изредка случается при кастомизации какого-нибудь стандартного инструмента, например генератора отчетов. igorolvНе считая уже большого числа пользователей-программистов, предпочитающих общаться с сервером из Management Studio. Есть такое. В том числе им довольно часто приходится выполнять уникальные операции, ХП для которых просто нет. igorolv В общем, и динамический sql и хранимые процедуры имеют как свои плюсы, так и минусы. А что выбрать - зависит от специфики проекта. Безусловно. igorolvВ нашем случае выгоднее оказались хранимые процедуры. В другом случае - динамический sql. Просто добавил несколько аргументов в пользу хранимок. Я к тому, что сами аргументы не все.. однозначны. igorolv- Ну нету у нас, разработчиков SQL Server, например, bind-переменных. Насколько я знаю, есть переменные, которые можно использовать тем же макаром. Может быть не очень красиво, но вроде работает как надо. Хотя вроде Merle убеждал меня, что сервер сам неплохо разбирается с параметризацией запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2006, 04:04 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerВ целом это и есть то, что я назвал "вечная боль". Уродливые неоптимальные запросы, ограниченные функционально фильтры конструкции вида "x.ID = @ID or @ID is null" - уродливые - пожалуй, но неоптимальными они становятся, когда @ID не null. А если @ID указан - значит выборка будет значительно меньше, значит - общая скорость не сильно пострадает. По фильтрам - фильтры могут быть очень сложными. Довольно дорогими, если проверять это условие для каждой записи, при формировании общей выборки. С фильтрами типа "поле = x, поле > x, поле like x" и клиент справится, не посылая заново запроса на сервер вида "старый запрос + "and еще-что-то". Кстати, так (используя DataView фильтр на клиентском датасете "and еще-что-то") будет гораздо быстрее (на клиенте - не нужно бегать за лишними данными на сервер (данные и так есть на клиенте), на сервере - не получая лишних запросов от клиента ) Но ведь бывают фильтры вида "договора, задолженность по которым на начало расчетного месяца < введенное_число, > введенное_число, >=, <=, в диапазоне и т.д.". Тут вполне можно использовать слой метаданных + динамический sql. Однако внутри этого sql-а можно оперировать, например, пересечениями результатов выполнения инлайновых функций, каждая из которых соответствует "своему" условию фильтра. Резюмируя - можно строить достаточно мощные механизмы фильтрации, используя доступ к данным через хранимые процедуры. При этом оставляя возможность менять логику на сервере, не меняя клиентское приложение. Однако, цена этому - необходимость разрабатывать специальные механизмы для фильтрации. softwarer igorolv либо пусть этой задачей занимается клиент. Хм. Ну это уже капитуляция. Этак весь серверный функционал можно сгрузить на клиента. А с сортировкой опять же - по одному полю еще можно, хотя кривовато, а если хочется по нескольким? Тогда совсем ужасно. Иногда, если хочется отсортировать данные по нескольким полям, это означает довольно большой объем запрошенной с сервера выборки. Возможно, стоит просто ограничить эту выборку дополнительным входным параметром процедуры. Кроме того, имеет место некоторый "шкурный" интерес - "сервер отдаст данные клиенту - а клиент пусть их у себя в памяти крутит как хочет". А то что получается - 1) загрузил себе клиент в память некий список "договоров" с помощью хп или запроса - не важно. 2) пользователь решает сменить сортировку и выбирает "Сортировка.По контрагенту". Получается, что все договора на клиенте уже есть в датасете, но нужно вызвать снова почти тот же самый запрос для новой загрузки всех "договоров", но только отсортированного по другому. Получается лишний запрос на сервер, которого могло бы и не быть... Клиентов много и все сплошь - толстые, а сервер - один... Выдал им их данные - пусть сами их отображают как хотят, причем меняя это отображение для клиента не спрашивая "совета" сервера. В общем, есть подозрение что сортировка - это частично функция отображения данных - а отображением данных пусть клиент занимается. softwarer А кто мешает ОДИН РАЗ передать на сервер скрипт из нескольких тысяч запросов? Это определенно будет работать не дольше, нежели ОДНА процедура, выполняющая внутри себя несколько тысяч отдельных запросов softwarer Впрочем, никто не мешает мне выполнить с клиента array dml. То есть передать на сервер один оператор insert..values и несколько тысяч строк данных, которые должны через него пройти. Это намного быстрее, чем выполнять несколько тысяч insert поотдельности. Очень похоже, только немножко другая реализация. Хранимка получает несколько тысяч строк, распиханных по нескольку десятку таблиц внутри одной xml-ки. А дальше по ОДНОМУ insert-у на КАЖДУЮ ТАБЛИЦУ данные insert into ... select ..from openxml (на sql server-е это - извлечение информации из xml-ки в табличном виде). Такая реализация "с xml" оказалась намного быстрее чем вызов нескольких тысяч insert-ов по-отдельности С КЛИЕНТА (устойчивый результат для разных тестовых случаях). Резюмируя - попробую протестировать, что окажется быстрее - затраты на разбор xml-параметра процедуры + ПО ОДНОМУ insert-у на каждую таблицу или же ОДИН раз С КЛИЕНТА переданный НАБОР нескольких тысяч insert-ов. softwarerВ том числе им довольно часто приходится выполнять уникальные операции, ХП для которых просто нет. 1) Если уникальные операции связаны с чтением данных - естественно, либо сами пишут хранимку и отправляют разработчику БД для проверки и включения в модель, либо заказывают хранимку у разработчика БД - все зависит от того, кто как знает sql. 2) Если имеется в виду, что есть операции, уникальным образом изменяющие записи в таблицах и выполняемые на сервере - то такие изменения в таблицах также можно производить через те же самые хранимки, изменяющие данные в таблицах. Если Вы про удобство - оно от этого не сильно страдает при "уникальных" операциях. достаточно в обычные select-запросы, описывающие изменения в таблицах добавить в начале "set @x xml = (", а в конце "for xml auto, elements". Наоборот - можно постепенно накопить в xml-ках все те изменения, которые хочется внести ("применить") к таблице или набору таблиц, а потом в одной короткой транзакции (опять же, не рекомендуются длинные транзакции на блокировочниках) залить все в таблицы. Опять же, унификация протоколирования изменений - а то, действительно, довольно забавно наблюдать аккуратно логируемые процедуры по внесению изменений в таблицы и зоопарк "дикого" dml, вызваемого в куче хранимых процедур класса "Провести документ", "расчитать остатки"... Следовательно, для эффективного использования хранимок внесения изменений в таблицы нужно еще одно дополнительное условие - чтобы ими пользовалась и серверная и клиентская часть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2006, 01:06 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer При чем тут сервер приложений? Откуда Вы его придумали и какое отношение он имеет к row-level security в OEBS? Значит я не понял вашего намека на row-level security в OEBS ;) Как же там это решено? softwarer Estetsа вот в данном случае действительно кэш планов помочь не может, т.к. SELECT ... WHERE doc_date < '20010101' и SELECT ... WHERE doc_date < '20020304' разные селекты. Хм. Во-первых, select ... where doc_date < :date и select ... where doc_date < :date - это вовсе не разные, а совсем даже одинаковые селекты, и кэш планов отлично поможет. Если программист пишет программу так, что убивает кэш - это проблема программиста, и она никак не означает "надо работать процедурами". Возможно, новые версии SQL и поддерживают автоматическую параметризацию запросов, в чем я вообщем не совсем уверен, учитывая что сравнение с константой и использование статистики может сильно повлиять на план выполнения запроса. Во вторых select ... where doc_date < :end_date и select ... where doc_date > :begin_date все таки разные запросы, а написать универсальное WHERE что бы не "убивает кэш", не всегда возможно/оптимально без использования процедур (например имеем штук пять полей по которым нужно фильтровать данные по диапазонам (сумма,дата,количество...), при том что любое поле или любой край диапазона может быть null) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:12 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
непонятно в чём предмет спора? СУБД это ведь объект инкапсулирующий данные (по ООП) и методы работы с ними? Рано или поздно программисту или клиенту БД потребуется задавать вопросы не на чистом SQL, а на более высоскоуровневом языке. Чем и является ХП. Код: plaintext Если система - калькулятор, то и ХП не нужно. ______________________________________________ Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:37 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolvконструкции вида "x.ID = @ID or @ID is null" - уродливые - пожалуй, но неоптимальными они становятся Становятся. Фильтры с OR в общем случае плохо оптимизируются. Главная причина - вообще говоря, оптимизатор должен строить и использовать уже не один план на запрос, а 2^N, где N - количество таких вот условий. Но признаться мне неизвестны оптимизаторы, которые бы так поступали. Далее, приведенные Вами в целом рассуждения резюмируются одной фразой: можно на пустом месте натворить себе кучу геморроя и в конце концов добиться примерно той же функциональности ценой больших тормозов. Практической выгоды при этом никто не получает; теоретически получаемая здесь независимость на практике накрывается медным тазом появившихся паразитных зависимостей. igorolvИногда, если хочется отсортировать данные по нескольким полям, это означает довольно большой объем запрошенной с сервера выборки. Оригинальная точка зрения. Никогда бы не подумал, что объем запрошенной выборки зависит от сортировки. igorolvВозможно, стоит просто ограничить эту выборку дополнительным входным параметром процедуры. Во-первых, это никак не связано ни с сортировкой, ни с процедурами. Если хочется обрезать выборку, это можно делать и без сортировки, и без процедур. Во-вторых, это плохая практика. Лучше - не заставлять клиента ждать полной выборки, пусть профетчит первую порцию и успокоится. Тогда если захочет, придет за второй, а скорее всего не придет. igorolvКроме того, имеет место некоторый "шкурный" интерес - "сервер отдаст данные клиенту - а клиент пусть их у себя в памяти крутит как хочет". Это не "шкурный" интерес, а жуткая неэффективность. igorolvПолучается лишний запрос на сервер, которого могло бы и не быть... Причем этот лишний запрос стоит гораздо дешевле, нежели затаскивание на клиента полной выборки. igorolvКлиентов много и все сплошь - толстые, а сервер - один... Выдал им их данные - пусть сами их отображают как хотят, причем меняя это отображение для клиента не спрашивая "совета" сервера. В общем, я не зря упомянул раньше термин "капитуляция". У Вас выходит замкнутый круг: сервер не справляется со своей работой, поэтому его функции перегружаются на клиента. Ради этого на клиента приходится тащить кучу лишних данных (лишних - поскольку в противном случае клиент не стал бы их фетчить), что собственно снова напрягает сервер. igorolvА дальше по ОДНОМУ insert-у на КАЖДУЮ ТАБЛИЦУ данные insert into ... select ..from openxml Понятно. Значит, по эффективности должно быть примерно эквивалентно array dml, если не считать собственно времени на возню с xml. igorolvили же ОДИН раз С КЛИЕНТА переданный НАБОР нескольких тысяч insert-ов. Кстати, не обязательно несколько тысяч. Я не знаю, как лучше в MSSQL, но почти уверен, что xml - не единственный в нем способ массовой вставки. igorolv1) Если уникальные операции связаны с чтением данных - естественно, либо сами пишут хранимку и отправляют разработчику БД для проверки и включения в модель, Уникальные операции. Нечто, что нужно выполнить один раз. В модели оно нафиг не нужно, потому что скорее всего больше никогда не потребуется. Just for example, пришла ко мне когда-то девушка и сказала: у нас баланс не сходится вот на эту сумму. Подсчитай пожалуйста, вот из таких вот оплаченных счетов, какие именно в сумме дадут это число? igorolvОпять же, унификация протоколирования изменений - а то, действительно, довольно забавно наблюдать аккуратно логируемые процедуры по внесению изменений в таблицы и зоопарк "дикого" dml, вызваемого в куче хранимых процедур класса "Провести документ", "расчитать остатки"... Честно говоря не понял, о чем Вы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:52 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv А то что получается - 1) загрузил себе клиент в память некий список "договоров" с помощью хп или запроса - не важно. 2) пользователь решает сменить сортировку и выбирает "Сортировка.По контрагенту". Получается, что все договора на клиенте уже есть в датасете, но нужно вызвать снова почти тот же самый запрос для новой загрузки всех "договоров", но только отсортированного по другому. Получается лишний запрос на сервер, которого могло бы и не быть... Клиентов много и все сплошь - толстые, а сервер - один... Выдал им их данные - пусть сами их отображают как хотят, причем меняя это отображение для клиента не спрашивая "совета" сервера. В общем, есть подозрение что сортировка - это частично функция отображения данных - а отображением данных пусть клиент занимается. А если это 10000 договоров, а клиент реально может отобразить не более 30, зачем тогда применять SQL-сервер... Есть еще один плюс в ХР - это безопасность, дать доступ некоторым пользователям на процедуру, которая изменяет только некоторые полей в таблице да еще в ней можно поставить условие, гораздо проще и легче использовать и модифицировать, нежели городить запрос к таблице в клиенте, который еще будет проверять, а имеет ли пользователь право на доступ к таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 15:07 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerСтановятся. Фильтры с OR в общем случае плохо оптимизируются. Главная причина - вообще говоря, оптимизатор должен строить и использовать уже не один план на запрос, а 2^N, где N - количество таких вот условий. Но признаться мне неизвестны оптимизаторы, которые бы так поступали. "OR" - сама по себе, естественно, конструкция которая может очень плохо сказаться на производительности. Однако не в данном конкретном случае. Дело в том, что конструкция "x.ID = @ID or @ID is null" оптимальнее, чем x.ID = isnull(@ID, ID). Так как некоторые оптимизаторы(MSSQL2005) в ДАННОМ КОНКРЕТНОМ случае "подменяют or на union". Т.е. x.ID = @ID or @ID is null работает эквивалентно по скорости ... where x.ID = @ID ... union ... where @ID is null. В общем да, при использовании фильтров с необязательными входными параметрами + слой хранимых процедур для доступа к данным возникает ряд проблем ("куча гемороя"), требующих решения. Решения вызывают не столько проблемы с производительностью, сколько необходимость их реализовывать. А потом смотреть на большой раздел секции "where" с многочисленными (" (x.ID1 = @ID1 or @ID1 is null) and (x.ID2 = @ID2 or @ID2 is null)") Это можно отнести к недостаткам решения "все через хранимки". softwarerНикогда бы не подумал, что объем запрошенной выборки зависит от сортировки. Имелось в виду следующее - когда пользователь меняет сортировку, иногда он хочет чего-то разыскать с помощью этой сортировки (упорядочить для себя данные с целью облегчения визуального поиска). Т.е. "если понадобилась сортировка" => значит, выборка большая. softwarerВо-вторых, это плохая практика. Лучше - не заставлять клиента ждать полной выборки, пусть профетчит первую порцию и успокоится. Тогда если захочет, придет за второй, а скорее всего не придет. softwarerПричем этот лишний запрос стоит гораздо дешевле, нежели затаскивание на клиента полной выборки. softwarerВ общем, я не зря упомянул раньше термин "капитуляция". У Вас выходит замкнутый круг: сервер не справляется со своей работой, поэтому его функции перегружаются на клиента. Ради этого на клиента приходится тащить кучу лишних данных (лишних - поскольку в противном случае клиент не стал бы их фетчить), что собственно снова напрягает сервер. Это уже вопрос, используется в проекте или нет постраничная выборка. У этого решения есть как свои плюсы (скорость), так и минусы (более сложно для реализации, согласованность чтения данных по порциям, что показывать в вертикальной полосе прокрутки, что показывать в "общее число записей", рост числа запросов, каждый из которых забирает порцию). Поэтому клиентщики как минимум, не всегда ее используют. Некоторые функции переносятся на клиент вовсе не потому, что сервер не справляется со своей работой, а потому что там это сделать проще и быстрее... В ЛЮБОМ случае смена сортировки на клиенте будет быстрее, так как данные у него уже в памяти - не нужно за ними бегать на сервер отдельным запросом. А изначальная установка сортировки, есть подозрение, во МНОГИХ случаях будет все равно быстрее на клиенте. (Кстати, сочетание постраничной выборки И сортировки на сервере - ой, не уверен что ВСЕГДА загрузка списка договоров из 10000 окажется быстрее чем загрузка "первых 30 договоров, отсортированных в определенном порядке"). Резюмируя, не ВСЕГДА сортировка на сервере предпочтительнее сортировки на клиенте. Это не "капитуляция" а осознанное решение по распределению функций между клиентом и сервером в ДАННОМ КОНКРЕТНОМ СЛУЧАЕ. softwarerКстати, не обязательно несколько тысяч. Я не знаю, как лучше в MSSQL, но почти уверен, что xml - не единственный в нем способ массовой вставки. В MS SQL таблица не может быть параметром хранимой процедуры или запроса, xml только поэтому (+ необходимость xml-логирования вызова каждой процедуры с ее параметрами). А способы insert-а: 1) insert into select таблица в общем случае быстрее чем insert into строка1 + insert into строка2, ... 2) insert into строка1 + insert into строка2, ...в общем случае быстрее чем insert into select (строка1 union all строка2) как еще можно быстро(надо) вставить много данных в таблицу(bulk insert, bcp и иже с ними не рассматривая)? Если чего-то есть - сообщите пожалуйста (надо) softwarerJust for example, пришла ко мне когда-то девушка и сказала: у нас баланс не сходится вот на эту сумму. Подсчитай пожалуйста, вот из таких вот оплаченных счетов, какие именно в сумме дадут это число? Безусловно, можно делать и прямые запросы (программисты, поддержка - все, кто имеет соответствующее право). Закрывать вообще структуру базы от всех и давать вместо нее набор хранимок - вряд ли верное решение. igorolvунификация протоколирования изменений Имеется в виду, что есть некий интерфейс внесения информации в таблицы. Для получения от этого интерфейса реальной выгоды, следует использовать его везде - как на клиентской стороне, так и на серверной. Резюмируя все вышесказанное мною: ГЛАВНОЕ, в проекте должно быть некоторое единое место, где хранится весь sql-код (либо отдельные составляющие, из которых он складывается). softwarerЕсли же чуть подумать, окажется, что разницы никакой - на самом деле "все использования всех объектов" в любом случае нужно выяснять в некотором заранее определенном списке мест. Что это за список - код хранимок ли, код клиента ли, конфигурационные таблицы с динамическим кодом - разницы вообще говоря нет.+1 Вариант со списком хранимок далеко не самый плохой. Скажем так, он ВПОЛНЕ ДОПУСТИМЫЙ. У него есть как плюсы, так и минусы. Если есть необходимость\желание (организационная) "отнять" у клиента "право" на работу с этим "хранилищем sql-запросов" + необходимость ПОМЕСТИТЬ его на сервер БД (хотя бы по организационным\архитектурным причинам) - вариант с хранимыми процедурами в ДАННОМ случае ПРЕДПОЧТИТЕЛЕН. Это РАБОТАЮЩЕЕ решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 17:14 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv делал как-то проект на XML Bulk Load /topic/103823 тоже было рабочее решение для поставленной задачи - быстрой заливке на сервер. Не подскажешь + и - такой реализации. В частности, не доконца у меня был отработан вопрос единого пакета транзакции своего кода на клиенте (или на сервере) и кода XML Bulk Load от MS в отдельном COM-объекте на клиенте. ______________________________________________ Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 18:28 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv"OR" - сама по себе, естественно, конструкция которая может очень плохо сказаться на производительности. Однако не в данном конкретном случае. Дело в том, что конструкция "x.ID = @ID or @ID is null" оптимальнее, чем x.ID = isnull(@ID, ID). Вопрос в том, что при полноценном формировании фильтра не нужно ни того, ни другого. В этом случае в запрос либо попадает x.ID = :ID либо не попадает ничего вообще; оба варианта более эффективны, нежели приведенные выше. Насчет замены OR на UNION я в курсе, Oracle ее делает. Но и UNION уступает в эффективности вышеприведенной строке. igorolvИмелось в виду следующее - когда пользователь меняет сортировку, иногда он хочет чего-то разыскать с помощью этой сортировки (упорядочить для себя данные с целью облегчения визуального поиска). Т.е. "если понадобилась сортировка" => значит, выборка большая. О! Именно. Теперь давайте считать. У нас на клиенте есть, допустим, 50 строк. Одно дело - дофетчить на него остаток "большой выборки". Другое дело - послать на сервер новый запрос, в результате которого снова вернется 50 строк. С ситуацией, когда первое быстрее, я столкнулся единственный раз в жизни. igorolvЭто уже вопрос, используется в проекте или нет постраничная выборка. У этого решения есть как свои плюсы (скорость), так и минусы (более сложно для реализации, Ээ... не понял. Мне казалось, это везде делается автоматически. igorolvсогласованность чтения данных по порциям Хм. Судя по этой фразе, Вы говорите о многократных запросах для выбора разных страниц. Я же имею в виду фетч из одного курсора. Правда, в соседней теме вроде выяснили, что в MSSQL тут могут быть проблемы с неконсистентным чтением при read committed, но они могут быть в любом случае. igorolv, что показывать в вертикальной полосе прокрутки, что показывать в "общее число записей", рост числа запросов, каждый из которых забирает порцию). Поэтому клиентщики как минимум, не всегда ее используют. Хм. Скажем так, единственная альтернатива - фетчить всю выборку сразу и целиком, что вызывает куда более неприятные проблемы. К динамическому изменению полозка пользователь относится куда терпимее, нежели к паузам при каждом открытии формы. igorolvНекоторые функции переносятся на клиент вовсе не потому, что сервер не справляется со своей работой, а потому что там это сделать проще и быстрее... В клиент-серверном случае более часто происходит обратный дрейф - "вроде бы клиентские" по смыслу функции выполняются на сервере из-за того, что иначе придется гнать на клиента слишком много данных. igorolvВ ЛЮБОМ случае смена сортировки на клиенте будет быстрее, так как данные у него уже в памяти - не нужно за ними бегать на сервер отдельным запросом. Не согласен с постулатом и соответственно с выводом. В памяти не "данные", а "первый небольшой кусок данных". Если сменить сортировку, нужно качать все данные - сортировать "уже скачанный кусок" глупо и нелепо [ладно, я готов согласиться, что есть специфические случаи, но в общем...] igorolvА изначальная установка сортировки, есть подозрение, во МНОГИХ случаях будет все равно быстрее на клиенте. Не понял. Не знаю как у Вас, а у меня есть очень простая возможность сравнить эти варианты. Запускаю PL/SQL Developer, выполняю Код: plaintext вижу результат через 0.25 секунды. Теперь выполняю Код: plaintext и жму его сортировку на клиенте - получаю 11.4 секунды на фетч данных и около двух секунд на собственно сортировку в памяти. igorolv(Кстати, сочетание постраничной выборки И сортировки на сервере - ой, не уверен что ВСЕГДА загрузка списка договоров из 10000 окажется быстрее чем загрузка "первых 30 договоров, отсортированных в определенном порядке"). Ээ.. не понял, как это сочетается с Вашей позицией. Я как раз уверен, что второй вариант будет много быстрее. igorolvРезюмируя, не ВСЕГДА сортировка на сервере предпочтительнее сортировки на клиенте. Теоретически - не всегда. Практически я столкнулся с предпочтительностью сортировки на клиенте один раз в жизни; это была аналитическая система, которую характеризовали тяжелые, долгие запросы и небольшие результирующие выборки (порядка десятков секунд и сотен записей соответственно). Соответственно, я готов согласиться насчет "выбора в конкретном случае", с помаркой, что этот случай редкий. Теперь, если вернуться к основному обсуждаемому вопросу, получим, что в некоторых конкретных случаях у ХП не будет геморроя с поддержкой сортировки (в остальных, имхо в подавляющем большинстве - будет). igorolvВ MS SQL таблица не может быть параметром хранимой процедуры или запроса, .. в целом я определенно не готов говорить об оптимальном для MSSQL пути, Вам виднее. igorolvЗакрывать вообще структуру базы от всех и давать вместо нее набор хранимок - вряд ли верное решение. OK, к этому утверждению мне и хотелось прийти. Как только мы уходим от "жестко процедурного API", мы можем задать вопрос "а почему бы и программе не делать прямые запросы там, где это удобно", и возможно, прийти к предпочитаемой мной идее "разумно процедурного API". Хотя заранее согласен с тем, что все зависит от ситуации, и у меня были приложения, целиком построенные на ХП. igorolvРезюмируя все вышесказанное мною: ГЛАВНОЕ, в проекте должно быть некоторое единое место, где хранится весь sql-код (либо отдельные составляющие, из которых он складывается). Вот под этим я готов подписаться, с некоторой оговоркой насчет того, что именно понимать под "единым местом". С моей точки зрения, в технологии довольно часто делают ошибку, путая разделение полномочий между разработчиками (тот пишет запросы, тот - гуй) и архитектуру/размещение приложения. Это разные вещи; скажем, если я пишу запросы - я пишу запросы. Но в зависимости от архитектуры приложения они могут быть обернуты в хранимки и размещаться на сервере, а могут быть обернуты в клиентские процедуры или компоненты. Интерфейс моего взаимодействия с разработчиком гуя в обоих случаях одинаков: тот обращается к некому объекту и получает от него датасет (в его клиентском представлении). igorolvВариант со списком хранимок далеко не самый плохой. Скажем так, он ВПОЛНЕ ДОПУСТИМЫЙ. Безусловно. Я здесь подчеркиваю, что он один из допустимых, а не единственно допустимый. Если помните, эту часть беседы мы начали с поиска мест использования; я хочу подчеркнуть, что хранимки здесь не дают преимущества над другими вариантами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 18:29 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
блин.....скока букф.....Сплошной холивар... Подольём масла в огонь: Осталось вспомнить, что практически все создатели ERP систем предпочитают обходится абсолютно без вьюх и ХП. Абсолютно вся логика вне сервера. Никаких констрайнтов ! Одно из справедливых оправданий - портируемость на любую СУБД-платформу и единая среда разработки (дизайнер этой ERP). А ещё ???????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 19:00 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Код: plaintext -- Сначала посмотрим для 30 договоров -- Выберем первые 30 договоров, отсортированые по названию типа документа Код: plaintext 1. 2. 3. -- Выберем все договора со всеми типами документов Код: plaintext 1. 2. Для конкретного случая главным является Reads. Процессоры сервера не перегружены (4 x Itanium 2). Память сервера - имеется. А узкое место - хранилище (ввод-вывод). Что можно там соптимизировать еще в RAID10? В общем чтение данных с диска - это как раз и есть узкое место. А тут order by (особенно в сочетании с чем-то вроде top-а) может повести себя не всегда лучшим образом. Понятно, что тормоза идут от top 30, но от этого же не легче. Это я все к чему - стоимость сортировки на сервере зависит от того, что находится вышет order by. А сортировка на клиенте - не зависит. Производительность зачастую "проявляет" себя как раз на сложных тяжелых запросах. И отягощать их order by-ем не хочется. На клиенте отсортировать в памяти небольшую (<= 10000) выборку не так уж и сложно-долго. А часть нагрузки с сервера снимается. Резюмируя - не так уж редки ситуации, когда отдать на клиент всю выборку бывает для сервера выгоднее, чем предварительно ее сортировать и отсылать только часть. Это, в частности, зависит от архитектуры системы. softwarer"разумно процедурного API".+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 19:56 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Petro123Первй вариант (который гуляет по форуму) с использованием OpenXML сервера мне не подходит, т.к. грузит весь док. в память и медленноват для больших документов XML. Попробовал второй вариант с использованием XML Bulk Load, который идёт от MS в SQLXML 3.0. Он использует для парсинга XML более быстрый механизм. И не требует что-либо писать на сервере в хранимках (я пока не понял кто что делает и как это получается на сервере :)). Все что со словом Bulk, будь то XML Bulk Load, bulk insert, bcp - работает быстро не просто так. Оно ничего (почти ничего) не пишет в журнал транзакций, следовательно разного рода rollback, commit - не дружит с этими технологиями. Для XML Bulk Load можно включить транзакционный режим (Transaction = true). Однако в этом случае он будет для каждой таблицы создаавть временный файл, и он сначала скопирует данные во временные файлы, а потом перенесет их с помощью bulk insert. Но 1) транзакционный режим не включить для загрузки двоичных данных 2) откатить потом все равно нельзя будет (bulk insert). Этот "транзакционный" режим гарантирует всего лишь полную загрузку, без возможности отката. Загрузка документа (ов) - хочется, чтобы документ либо весь загрузился, либо не загрузился. А ведь после загрузки документа бывают же еще проверки, которые могут не выполнится. После невыполнения этих проверок как раз и возникает желание сделать rollback - но увы... Следовательно, для частого сохранения относительно небольших xml-документов лучше использовать openxml. А для массовой загрузки больших объемов данных - bulk механизмы. А сами плюсы использования xml для сохранения объектов на сервере: 1) возможность передачи изменений в объектах один раз на сервер (for example - для MS SQL возможность иметь хранимую процедуру "Договор.Сохранить", возможность залогировать ее вызов (один раз!) и ее параметры - указать какой именно документ мы сохраняем). 2) радикальное сокращение ДЛИТЕЛЬНОСТИ транзакции для сохранения объекта (на блокировочниках ой как важно). С xml- это эквивалентно сначала неспешной загрузки данных во временные таблички, а затем быстрое сохранение из временных табличек в таблицы БД. 3) показывать лог изменений клиенту довольно удобно, если они в виде набора "процедура" + "xml-завернутые-параметры". 4) любой dataset может сформировать отчет о своих изменениях в виде xml (getChanges) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 20:39 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv softwarerВо-вторых, это плохая практика. Лучше - не заставлять клиента ждать полной выборки, пусть профетчит первую порцию и успокоится. Тогда если захочет, придет за второй, а скорее всего не придет. ... Это уже вопрос, используется в проекте или нет постраничная выборка. У этого решения есть как свои плюсы (скорость), так и минусы (более сложно для реализации, согласованность чтения данных по порциям, что показывать в вертикальной полосе прокрутки, что показывать в "общее число записей", рост числа запросов, каждый из которых забирает порцию). Поэтому клиентщики как минимум, не всегда ее используют.Небольшой offtop - а что, это действительно вызывает какие-то проблемы при реализации клиента? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 20:59 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer igorolvЭто уже вопрос, используется в проекте или нет постраничная выборка. У этого решения есть как свои плюсы (скорость), так и минусы (более сложно для реализации, Ээ... не понял. Мне казалось, это везде делается автоматически.Ага, спасибо, я так и предполагал :-) softwarer igorolvЗакрывать вообще структуру базы от всех и давать вместо нее набор хранимок - вряд ли верное решение. OK, к этому утверждению мне и хотелось прийти. Как только мы уходим от "жестко процедурного API", мы можем задать вопрос "а почему бы и программе не делать прямые запросы там, где это удобно", и возможно, прийти к предпочитаемой мной идее "разумно процедурного API". Хотя заранее согласен с тем, что все зависит от ситуации, и у меня были приложения, целиком построенные на ХП.Однажды представитель одного заказчика выразил, на мой взгляд, довольно верную идею - "пусть будет безобразно, но однообразно" :-) IMHO, однообразие того стоит и в этом смысле мне нравится "жесткий процедурный API" softwarerС моей точки зрения, в технологии довольно часто делают ошибку, путая разделение полномочий между разработчиками (тот пишет запросы, тот - гуй) и архитектуру/размещение приложения. Это разные вещи; скажем, если я пишу запросы - я пишу запросы. Но в зависимости от архитектуры приложения они могут быть обернуты в хранимки и размещаться на сервере, а могут быть обернуты в клиентские процедуры или компоненты. Интерфейс моего взаимодействия с разработчиком гуя в обоих случаях одинаков: тот обращается к некому объекту и получает от него датасет (в его клиентском представлении).Гм... Как только я создаю "клиентскую компоненту", у разработчика гуя работы больше не остается. Скажем так, если я занимаюсь написанием запросов в клиенте, то конечно, я могу отдать этот объект на дальнейшую доработку разработчику гуя, но, IMHO, не совсем правильно, когда с одним и тем же объектом работают два человека. Хотя, разумеется, возможны варианты ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 21:22 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
PL99Небольшой offtop - а что, это действительно вызывает какие-то проблемы при реализации клиента? Предположим, есть таблица из 10000 записей. Есть запрос, грузящий "краткий справочник" из этой таблицы. (нечто вроде select А, Б, В from Таблица) Размер страницы пусть будет [пожимает плечами] = 100 записей. Опустим задачи, которые потребуется решить на стороне сервера (отдельным пунктом забудем про неконсистентное чтение) - посмотрим, что нужно решить на стороне с клиента. Для пользователя "визуализировать" как будто у него все данные загружены. 1) Нужно показать пользователю позицию загруженной страницы данных в вертикальной полосе прокрутки. Где в соответствии с текущей сортировкой должен быть поставлен указатель? На первых 10%, 20%, 30%? Что нужно делать, если пользователь взял за ползунок и быстро потянул его вниз? К этому же - иногда нужно показать нечто вроде 1342/10342. (Т.е. знать общее количество записей). Если мы загрузили только порцию данных - откуда мы знаем их общее количество? 2) Скорее дизайн-соображение: пользователь хочет иметь полный контроль над своими данными. Для него-то нужно представить в гриде дело так, как будто данные все уже загружены. А сделать это гораздо проще, если данные действительно загружены в память. 3) Есть некоторое подозрение, что при загрузке очередной порции данных сервер будет хоть чуть-чуть, но притормаживать: 1) забрать соединение[а если еще и пула нет - открыть 2) провериться на права доступа 3) запустить запрос на выполнение. 4) дождаться когда можно будет прочитать данные ReadCommited (не стоят ли блокировки какие-нибудь) 5) загрузить результат в датасет или что-то еще 6) оповестить всех подписчиков на изменение этого датасета или чего-то еще 7) дождаться оживленной реакции подписчиков Т.е. будут постоянно чуть-чуть паузы при работе с таблицей, отображенной в гриде. А если (чур меня) будут проблемы с блокировками - совсем плохо. 4) Реализация разного рода инкрементальных локаторов в случае постраничной загрузке будет все же подтормаживать "радуя" тем самым пользователя. [Инкрементальный локатор - это когда мы в поле ввода нажимаем "И" + "В" + "А" + "Н" + "О" + "В". и в процессе нажатия на клавиши постепенно отбираем Иванова.] Тут все-таки придется выполнять по запросу на каждое нажатие клавиши - а тут можно не успеть за пользователем. 5) Дизайн-соображение: подозреваю, что как минимум некоторые пользователи предпочтут подождать пару секунд (но не более) при открытии формы, чем ждать по 0.3 секунды (которая может растянуться) при переходе с очередной сотни записей на другую. 6) Не очень представляю, как постраничная загрузка может гармонично (как негармонично - вполне представляю :)) сочетаться с гридом, в котором есть древовидная колонка (ID - PARENT_ID). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 21:51 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
PL99Однажды представитель одного заказчика выразил, на мой взгляд, довольно верную идею - "пусть будет безобразно, но однообразно" :-) IMHO, однообразие того стоит и в этом смысле мне нравится "жесткий процедурный API" У цитаты есть и продолжение безобразно делать мы уже научились :) Однообразие в данном случае - вовсе не обязательно "процедурный API", скорее - единое хранилище sql-кода в системе (с определенными оговорками). SQL - это язык для формирования любых, произвольных, не предусмотренных заранее разработчиком\приложением запросов к системе. Если весь код общения с сервером из приложения находится, например, в хранимках, это дает достаточно сильную гарантию того, что кто-то из программистов не будет "подпольно" писать sql-код помимо этого хранилища. (Встречал я в таких "хранилищах" нечто вроде "select :строковый_параметр1 from :строковый_параметр2. хотя, такой "паттерн" вполне можно и в хранимку обернуть). Программиста довольно сложно удержать голым "регламентом" от чего-то вроде query.Text = "select A, B, C from Т". Даже если оставить вопросы возможности редизайна в стороне - хочется ЗНАТЬ "все ли sql-операции, используемые в системе компилируются В ДАННЫЙ МОМЕНТ?", "Где используется такая-то функция"? Все это можно реализовать и НЕ на хранимых процедурах. Однако на хранимых процедурах все это ВПОЛНЕ МОЖНО реализовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 22:12 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolvЕсли весь код общения с сервером из приложения находится, например, в хранимках, это дает достаточно сильную гарантию того, что кто-то из программистов не будет "подпольно" писать sql-код помимо этого хранилища. (Встречал я в таких "хранилищах" нечто вроде "select :строковый_параметр1 from :строковый_параметр2. хотя, такой "паттерн" вполне можно и в хранимку обернуть). Ага. А для пущей гарантии программистов надо вообще лишить любых любых прав доступа, желательно - вообще удалить за пределы досягаемости :) Проблема в значительной степени надумана. И профилактика тоже элементарна - обычный code review. Если не хватает сил делать это на постоянной основе, то можно приурочить к каким-либо значимым для программиста событиям вроде беседы о размере оплаты труда - лишь бы коллектив знал о неотвратимости процесса ;) igorolvПрограммиста довольно сложно удержать голым "регламентом" от чего-то вроде query.Text = "select A, B, C from Т". Даже если оставить вопросы возможности редизайна в стороне - хочется ЗНАТЬ "все ли sql-операции, используемые в системе компилируются В ДАННЫЙ МОМЕНТ?", "Где используется такая-то функция"? А на эту тему существуют ежедневные сборки проекта и системы управления версиями. В общем, решать технологические задачи за счет архитектуры продукта - на мой взгляд тоже ошибка проектирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 23:04 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolvНе уверен, что пользователю понадобится сортировка по object_id Хм. Стоит ли придираться к таким мелочам? Для любой колонки или колонок эффект будет аналогичным. igorolv -- Выберем первые 30 договоров, отсортированые по названию типа документа select top 30 * Уже не понял. Зачем выбирать 30? Это в тему страничного считывания? Неужели меня обманули, когда говорили, что в MSSQL есть нормальный неполный фетч? igorolvПонятно, что тормоза идут от top 30, но от этого же не легче. Как раз легче. Я не понимаю, зачем Вам понадобился этот top 30. С другой стороны, я не очень понимаю, почему мешает именно top 30. Из общих соображений я бы предполагал, что раз уж мы отсортировали, обрезать выборку легко. igorolvЭто я все к чему - стоимость сортировки на сервере зависит от того, что находится вышет order by. А сортировка на клиенте - не зависит. Производительность зачастую "проявляет" себя как раз на сложных тяжелых запросах. И отягощать их order by-ем не хочется. Согласен, но тут есть один момент. Запросы, выводимые пользователю в гридах (или аналогичных инструментах с возможностью сортировки) как правило очень простые, и сортировка их не тормозит. Сложные запросы типичны для "внутренностей" ИС, но там сортировка пользователем не настраивается, а как правило и не нужна. igorolvНа клиенте отсортировать в памяти небольшую (<= 10000) выборку не так уж и сложно-долго. А часть нагрузки с сервера снимается. На сервер при этом добавляется нагрузка чтения всех данных и передачи их на клиента, в то время как для сортированной выборки сервер может прочитать только небольшую часть данных. igorolvРезюмируя - не так уж редки ситуации, когда отдать на клиент всю выборку бывает для сервера выгоднее, чем предварительно ее сортировать и отсылать только часть. Это, в частности, зависит от архитектуры системы. Думаю, не стоит спорить о числовых значениях "не так уж редки". Обращу внимание на другую сторону вопроса: если мы делаем запросы с клиента, мы полностью вольны в выборе где именно и как именно сортировать. Если же мы идем через ХП, серверная сортировка осложняется - а "не так уж редки" случаи, где именно она будет предпочтительной. На всякий случай еще раз отмечу, что по большинству реально значимых вопросов мы с Вами явно согласны. Я исключительно занудствую :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 23:18 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
PL99Однажды представитель одного заказчика выразил, на мой взгляд, довольно верную идею - "пусть будет безобразно, но однообразно" :-) Я согласен с реакцией igorolv :-) Вопрос "преимущества и недостатки унифицированного подхода против преимуществ и недостатков индивидуально подхода" - классический, вечный вопрос любой инженерной профессии. Имеет он и достаточно универсальный ответ: чем ниже технологический уровень изделия, тем более оправдана унификация и наоборот, чем выше требования к качеству результата, тем тщательнее нужно подходить к каждой детали. PL99IMHO, однообразие того стоит и в этом смысле мне нравится "жесткий процедурный API" Жесткий процедурный API в общем случае не позволяет получить изделие приемлимого с моей точки зрения качества. Что для меня закрывает вопрос о нем как о единственном и универсальном методе. PL99Гм... Как только я создаю "клиентскую компоненту", у разработчика гуя работы больше не остается. Не вижу оснований для такой точки зрения. Работа у него остается ровно та же самая: визуализировать данные, отстроить пользовательский интерфейс, в нужные моменты вызывать указанные методы. Что внутри этих методов - ХП или "запросы с клиента" - заведомо не должно его волновать, это базовый принцип инкапсуляции. PL99Скажем так, если я занимаюсь написанием запросов в клиенте, то конечно, я могу отдать этот объект на дальнейшую доработку разработчику гуя, но, IMHO, не совсем правильно, когда с одним и тем же объектом работают два человека. Хотя, разумеется, возможны варианты ;-) На какую дальнейшую разработку? Один разработал, другой использует, совершенно нормальная картина. Хотя уже в рамках другого вопроса - я полагаю неправильной ситуацию, когда каждый программист занимается только своим куском и не способен подхватить чужие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 23:26 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerНеужели меня обманули, когда говорили, что в MSSQL есть нормальный неполный фетч? Можно, конечно, это и нормальный неполный фетч, но... (вот откуда ноги про top 30 торчат) Разработчик MS SQL с удовольствием познакомится с нормальным неполным фетчем в MS SQL. Версии от 2000. Временные таблицы и аналитические функции не предлагать. :) softwarerНа всякий случай еще раз отмечу, что по большинству реально значимых вопросов мы с Вами явно согласны.+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 00:40 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousИ профилактика тоже элементарна - обычный code review. Если не хватает сил делать это на постоянной основе, то можно приурочить к каким-либо значимым для программиста событиям вроде беседы о размере оплаты труда - лишь бы коллектив знал о неотвратимости процесса ;) andrey_anonymousА на эту тему существуют ежедневные сборки проекта и системы управления версиями. Если такого рода проблемы возникли при code review, это означает что "вредоносный" код УЖЕ в системе. Не каждый же день code review. Код-то уже написан, оттестирован, может быть даже уже дошел до Заказчика. А его нужно переписывать. тем более при беседе о размере оплаты труда - если уж вопрос поднимается ТАМ, подозреваю, программист уже сделал кучу подобных ошибок, некоторые из которых вызвали самую живую реакцию Заказчика. А если он такие ошибки изначально НЕ СУМЕЕТ сделать - может быть это и хорошо? А на code review потратить внимание программиста на его другие "подвиги". Ежедневные сборки проекта не помогут - код-то компилируется и даже тесты проходит. Системы контроля версий помогут только установить "виновника торжества" - но и только. andrey_anonymousВ общем, решать технологические задачи за счет архитектуры продукта - на мой взгляд тоже ошибка проектирования. Всегда казалось, что архитектура продукта должна упрощать программисту возможность делать его работу. Как раз решая за него (или предлагая решение по умолчанию) технологические задачи. Разве архитектурное решение (ограничение) хуже предлагаемого Вами организационного решения (ограничения)? В данном случае, архитектурное решение - это как констрейнт в базе. Его просто НЕ ПОЛУЧИТСЯ нарушить. А если снимать констрейнты, вынося их на сервер приложений или еще куда - кто-то их непременно нарушит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 01:02 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerВопрос "преимущества и недостатки унифицированного подхода против преимуществ и недостатков индивидуально подхода" - классический, вечный вопрос любой инженерной профессии. Имеет он и достаточно универсальный ответ: чем ниже технологический уровень изделия, тем более оправдана унификация и наоборот, чем выше требования к качеству результата, тем тщательнее нужно подходить к каждой детали. Где-то видел классную метафору на сей счет: это как МакДональдс vs Классный шеф-повар. В МакДональдс-е берем любую обезьяну, учим ее по строгим и жестким инструкциям готовить бигмак - и получаем бигмаг - не классный, но ПРИЕМЛЕМЫЙ... Зато можем в любой момент уволить кучу обезьян, нанять кучу обезьян - бигмак будет тот же самый. Классный шеф-повар может приготовить классное блюдо, рядом с которым бигмак, гм... Однако если он вдруг уйдет, заболеет и т.п. - никто не сумеет продолжать готовить такое же классное блюдо... Обе модели вполне жизнеспособны. Можно работать и так и так. Главное не смешивать эти модели - иначе получим кучу обезьян, делающих те же самые бигмаки, зато если кто-то из обезьян уйдет - не получатся и они... Так что вопрос, что позволять, а что не позволять программисту - это зависит от проекта и от программистов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 01:20 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv andrey_anonymousИ профилактика тоже элементарна - обычный code review ... лишь бы коллектив знал о неотвратимости процесса ;) Если такого рода проблемы возникли при code reviewКажется, пришел мой черед удивляться :) Проблемы такого рода не возникают при code review (кроме случаев профнепригодности reviewer :). При review они всего лишь выявляются . Основа командной разработки - "стандарты разработки". Обязательные к применению всеми членами проектной команды. Сюда входят в том числе и соглашения об именовании переменных, и правила оформления кода, и требования к содержанию комментариев, и перечень запрещенных к повторению типовых ошибок. Новый член команды регулярно представляет код на проверку, опытные товарищи - пореже :) Важно именно коллективное осознание того факта, что любой кусок кода может быть проверен в любой момент времени и общее отрицательное отношение к нарушению соглашений. Это не панацея, но оправдывающая себя практика. igorolvА если он такие ошибки изначально НЕ СУМЕЕТ сделать - может быть это и хорошо?Сумеет. Человек изобретателен. А вот то, что в нужный момент вполне грамотный специалист не сможет воспользоваться наиболее эффективным подходом к задаче - факт. Просто потому, что не существует универсальных правил "это всегда хорошо, а вот то - заведомо плохо". Ограничивая программистов искусственными рамками, Вы заведомо лишаете команду возможности создать эффективный продукт. igorolvЕжедневные сборки проекта не помогут - код-то компилируется и даже тесты проходит.Замечательно. Значит, система соответствует ТЗ. igorolv Системы контроля версий помогут только установить "виновника торжества" - но и только.Какого виновника? Система управления версиями должна помогать отвечать на вопрос "кто использует мой код", а стандарты разработки - определять безопасный способ внесения изменений в интерфейсы. igorolv andrey_anonymousВ общем, решать технологические задачи за счет архитектуры продукта - на мой взгляд тоже ошибка проектирования.Всегда казалось, что архитектура продукта должна упрощать программисту возможность делать его работу. Как раз решая за него (или предлагая решение по умолчанию) технологические задачи. Не согласен. Архитектурные решения должны позволять строить надежное и сопровождаемое приложение , а не затыкать технологические дыры. Технология разработки должна позволять реализовывать наиболее выгодную архитектуру, а не диктовать какие-то техничесие решения "на все случаи жизни". Пропоганда "best practicles" должна вводить в обиход наиболее удачные паттерны. И смешивать не стоит. На счет же "НЕ ПОЛУЧИТСЯ нарушить констрейнт архитектурного решения"... Искренне завидую Вашему оптимизму :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 01:59 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv1) Нужно показать пользователю позицию загруженной страницы данных в вертикальной полосе прокрутки. .... Хм. Excel вполне терпимо справляется с этой задачей. В целом - я согласен с тем, что здесь есть проблема. Но ее вес.. куда меньше, это уже из серии "жемчуг мелок". igorolv2) Скорее дизайн-соображение: пользователь хочет иметь полный контроль над своими данными. Я не очень понимаю, что Вы называете "полный контроль". Пользователь, по моим представлениям, предпочитает приближаться к нужной цели методом последовательных приближений. То есть взглянуть на выборку, наложить фильтр, взглянуть на получившуюся выборку, усилить фильтр, отсортировать получившуюся выборку и наконец увидеть на первой странице нужную запись - примерно так. Это, конечно, чуть утрировано, и опытные пользователи справляются быстрее, но тем не менее, запрос первой страницы - очень типичная операция. Конечно, можно прокачать данные на клиента и дальше вертеть их там. Что здорово похоже на перенос функций сервера на клиента. igorolv3) Есть некоторое подозрение, что при загрузке очередной порции данных сервер будет хоть чуть-чуть, но притормаживать: Согласен. При этом следует иметь в виду, что пользователи сравнительно редко листают длинные выборки - хотя бывает. И определенно, большинство людей относится к ожиданиям "часто по чуть-чуть" куда терпимее, нежели к "редко, но долго". Практически существует комфортное время отклика системы на действия пользователя - где-то 0.1-0.3 секунды - и пока программа его выдерживает, пауза только на руку. igorolvТут все-таки придется выполнять по запросу на каждое нажатие клавиши - а тут можно не успеть за пользователем. Кстати, не согласен. Довольно типичное решение в такой ситуации - выполнить запрос, когда пользователь сделает паузу в наборе. Согласен, наличие полного набора данных на клиенте позволяет решить ситуацию лучше, но и с паузой получается вполне комфортно. igorolv5) Дизайн-соображение: подозреваю, что как минимум некоторые пользователи предпочтут подождать пару секунд (но не более) при открытии формы, чем ждать по 0.3 секунды (которая может растянуться) при переходе с очередной сотни записей на другую. Чуть выше я привел числа, полученные в первом же эксперименте. 0.25 секунды против 13.4 Не знаю пользователей, которые предпочтут второй вариант первому, особенно чтобы просмотреть первую страницу. igorolv6) Не очень представляю, как постраничная загрузка может гармонично (как негармонично - вполне представляю :)) сочетаться с гридом, в котором есть древовидная колонка (ID - PARENT_ID). Хм. Не понимаю разницы. Для иерархии единственное, что нужно - чтобы записи шли в специфическом порядке, в остальном - обычная выборка. В Oracle я сделаю это через CONNECT BY, в MSSQL вроде бы появился CTE с рекурсией. В обоих случаях - никаких проблем со страничной загрузкой. Если Вы имеете в виду именно деревянную функциональность, неполное раскрытие, то лично я предпочитаю решать эту задачу через независимые запросы для отдельных узлов. Так и удобнее, и появляется возможность строить неоднородное дерево. igorolvЕсли весь код общения с сервером из приложения находится, например, в хранимках, это дает достаточно сильную гарантию того, что кто-то из программистов не будет "подпольно" писать sql-код помимо этого хранилища. Почему, собственно? igorolv(Встречал я в таких "хранилищах" нечто вроде "select :строковый_параметр1 from :строковый_параметр2. хотя, такой "паттерн" вполне можно и в хранимку обернуть). Есть такое. Неоднократно видел хранимки типа EXECUTE_SQL (Statement varchar). В MSSQL, если не ошибаюсь, даже есть такая стандартная, кажется sp_executesql. igorolvПрограммиста довольно сложно удержать голым "регламентом" от чего-то вроде query.Text = "select A, B, C from Т". .. причем независимо от того, выстроен ли интерфейс на хранимках или нет. Лично я не люблю решать административно задачи, легко решающиеся технически. Прежде всего, я стараюсь держать разумных программистов, которых не нужно постоянно контролировать, достаточно объяснить, а от случайных неприятностей страховать на уровне кода: например, мой компонент сессии просто не позволит выполниться коду с установленным AutoCommit. Если потребуется, завтра я могу точно так же запретить выполнять через него все, кроме хранимок. igorolvДаже если оставить вопросы возможности редизайна в стороне - хочется ЗНАТЬ "все ли sql-операции, используемые в системе компилируются В ДАННЫЙ МОМЕНТ?", Хм. Мне казалось, что с этим у MSSQL проблема, разве нет? Хотя и в оракловом механизме есть не только плюсы, но и неудобства. А вот насчет "хочется знать"... честно говоря, не хочется. Предпочитаю действовать так, чтобы не было причин сомневаться. igorolvВсе это можно реализовать и НЕ на хранимых процедурах. Однако на хранимых процедурах все это ВПОЛНЕ МОЖНО реализовать. Это перестает действовать как только появляется динамический SQL. А динамический SQL такая штука, что использовать его надо аккуратно и уместно, но как только он есть, тут же обнаруживаются чертовски уместные места. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 03:42 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
в этой дискуссии забыли упомянуть полезное свойство проекта на ХП - легкость создания Web приложений. Если ХП реализуют бизнес логику (а не insert - uptade), то цена разработки web приложения чисто интерфейсная. Если толстый клиент активно использует для бизнес функций собственный SQL код, контролировать разработку двух клиентов (толстый+тонкий) непросто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 10:11 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
no-userв этой дискуссии забыли упомянуть полезное свойство проекта на ХП - легкость создания Web приложений. В принципе да. Хотя если не ошибаюсь, это верно только для "совсем невесомых" клиентов. no-userЕсли ХП реализуют бизнес логику (а не insert - uptade), То это чаще всего правильно в любом случае. no-userЕсли толстый клиент активно использует для бизнес функций собственный SQL код, контролировать разработку двух клиентов (толстый+тонкий) непросто. Скорее не соглашусь. Если разрабатываются два клиента, более чем естественно активно использовать в них общий код; собственно по-хорошему это должен быть скорее один клиент с двумя faces. При этом "собственный SQL код" никаких проблем не доставляет. Ситуация же "две нескоординированных команды разрабатывают два разных клиента к одному приложению" не представляется мне сколько-нибудь правильной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 10:55 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Скорее не соглашусь. Если разрабатываются два клиента, более чем естественно активно использовать в них общий код; собственно по-хорошему это должен быть скорее один клиент с двумя faces. А где и как хранится этот код (Source Safe в виде модулей каких то?) и как две группы разработчиков его используют? Возьмем, к примеру, две группы Дельфи и PHP кодеров. Что они делают с этим кодом, copy/paste в два разных приложения? softwarer При этом "собственный SQL код" никаких проблем не доставляет. Ситуация же "две нескоординированных команды разрабатывают два разных клиента к одному приложению" не представляется мне сколько-нибудь правильной. использование разработчиками интерфейсов только вызовов ХП решает две проблемы: 1) нельзя сделать одну бизнес операцию двумя разными способами: разработчик интерфейса может пользоваться лишь тем, что ему дали в руки 2) документация: API к БД - это - названия ХП типа orderCreate,orderSelect, ,orderItemAdd, orderItemUpdate - заголовки ХП и - описание бизнес логики. Совокупность этих двух вещей дает минимальные усилия на координацию. Если бизнес процедура не реализована в ХП - ее нельзя использовать (и разработчик интерфейса не может copy/paste чужой SQL код в свой PHP скрипт). Если бизнес процедура реализована в ХП - она тем самым на 80% документирована: небольшое описание бизнес логики и возможность взглянуть на код процедуры достаточно для разработчика интерфейсов. Конечно не всегда такой подход оправдан, но для меня 1000 ХП с разумными названиями выглядят проще для понимания, чем 150 таблиц и SQL код разбросанный по приложению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 14:49 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerИ определенно, большинство людей относится к ожиданиям "часто по чуть-чуть" куда терпимее, нежели к "редко, но долго". Практически существует комфортное время отклика системы на действия пользователя - где-то 0.1-0.3 секунды - и пока программа его выдерживает, пауза только на руку. Это если 0.1-0.3 секунды. А если программа начинает его НЕ выдерживать (рост объема данных, блокировки при одновременной работе, глюки сети). трансформируется в 0.5 -> 1 -> 2 секунды, то пауза в 2 секунды при перелистывании страниц иногда раздражает больше, чем пауза в 5 секунд при открытии формы. А достаточно посмотреть на то, как предлагается реализовывать неполный фетч в MS SQL (ссылку указывал в прошлых постах), то 0.1 - 0.3. секунды ТАК довольно сложно выдержать. Плюс еще и блокировки, которые могут легко увести время в бесконечность... softwarerЕсли Вы имеете в виду именно деревянную функциональность, неполное раскрытие, то лично я предпочитаю решать эту задачу через независимые запросы для отдельных узлов. Так и удобнее, и появляется возможность строить неоднородное дерево. Я и хотел указать, что в данном случае требуется специальный подход. softwarerДовольно типичное решение в такой ситуации - выполнить запрос, когда пользователь сделает паузу в наборе. Согласен, наличие полного набора данных на клиенте позволяет решить ситуацию лучше, но и с паузой получается вполне комфортно. Как раз и зависит от того, нужна ли обратная связь (визуализация результата (a-la Linquo)) в процессе набора или нет. softwarerдает достаточно сильную гарантию того, что кто-то из программистов не будет "подпольно" писать sql-код помимо этого хранилища. Тут способов очень много - у каждого он свой. "например, мой компонент сессии просто не позволит выполниться коду с установленным AutoCommit. Если потребуется, завтра я могу точно так же запретить выполнять через него все, кроме хранимок" если нужно разрешить либо хранимки либо "особые запросы" можно сделать "кроме хранимок, или запросов, которые...." softwarerХм. Мне казалось, что с этим у MSSQL проблема, разве нет? Хотя и в оракловом механизме есть не только плюсы, но и неудобства. А вот насчет "хочется знать"... честно говоря, не хочется. Предпочитаю действовать так, чтобы не было причин сомневаться. Самописное решение, прикрученное к сборкам и прогонам тестов. В меня, все же, вселяет некоторое спокойствие знание, что все 200.000 строк серверного кода, при активном изменении различных таблиц, процедур и функций ВСЕГДА 1) компилируется 2) при запуске на mock-базе не ломается 3) проходит все тесты 4) соответствует принятым внутри группы sql-конвенциям. andrey_anonymous Проблемы такого рода не возникают при code review (кроме случаев профнепригодности reviewer :). При review они всего лишь выявляются. Да, я и имел это в виду, оговорился. Но если они выявляются , значит, они уже есть . andrey_anonymousСумеет. Человек изобретателен. А вот то, что в нужный момент вполне грамотный специалист не сможет воспользоваться наиболее эффективным подходом к задаче - факт. Просто потому, что не существует универсальных правил "это всегда хорошо, а вот то - заведомо плохо". Ограничивая программистов искусственными рамками, Вы заведомо лишаете команду возможности создать эффективный продукт. Символьную строку он в поле с типом int не запихнет никаким образом, несмотря на всю изобретательность :) А почему ограничиваю - любой запрос (даже динамический) можно в хранимку завернуть. А если при этом придется выдумать хранимке название и описание - то это же не ограничение :). К тому же я специально оговаривал, что "Как раз решая за него (или предлагая решение по умолчанию )". А динамический sql все же БЫВАЮТ ситуации когда работает неэффективнее статического. Могу даже пример вызова 500 раз статического sql против вызова 500 раз динамического sql, даже для Oracle привести (если нужно)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 16:26 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv PL99Небольшой offtop - а что, это действительно вызывает какие-то проблемы при реализации клиента? Предположим, есть таблица из 10000 записей. ... посмотрим, что нужно решить на стороне с клиента. Для пользователя "визуализировать" как будто у него все данные загружены. 1) Нужно показать пользователю позицию загруженной страницы данных в вертикальной полосе прокрутки. Где в соответствии с текущей сортировкой должен быть поставлен указатель? На первых 10%, 20%, 30%? Что нужно делать, если пользователь взял за ползунок и быстро потянул его вниз?Ваш вопрос понятен. Я отдаю его решение на усмотрение среды разработки. Ползунок при этом (при первом отображении) занимает более 90% высоты "грида". За последние 10 лет претензий по этому поводу слышать не приходилось :-) igorolvК этому же - иногда нужно показать нечто вроде 1342/10342. (Т.е. знать общее количество записей). Если мы загрузили только порцию данных - откуда мы знаем их общее количество? Я допускаю, что такое требование (общее количество записей) может потребоваться в каких-либо аналитических отчетах. Но в отчете так или иначе придется грузить всю выборку (например для печати). Если же обсуждать именно "грид" - то это из серии любой каприз за ваши деньги ;-) igorolv2) Скорее дизайн-соображение: пользователь хочет иметь полный контроль над своими данными. Для него-то нужно представить в гриде дело так, как будто данные все уже загружены. А сделать это гораздо проще, если данные действительно загружены в память.Здесь можно начать обсуждать термин "полный контроль". igorolv3) Есть некоторое подозрение, что при загрузке очередной порции данных сервер будет хоть чуть-чуть, но притормаживать: 1) забрать соединение[а если еще и пула нет - открыть 2) провериться на права доступа 3) запустить запрос на выполнение. 4) дождаться когда можно будет прочитать данные ReadCommited (не стоят ли блокировки какие-нибудь) Запрос уже выполняется - курсор на сервере открыт. Возможно, что подобная реализация нежелательна для MSSQL Server. igorolv 5) загрузить результат в датасет или что-то еще 6) оповестить всех подписчиков на изменение этого датасета или чего-то еще 7) дождаться оживленной реакции подписчиков Т.е. будут постоянно чуть-чуть паузы при работе с таблицей, отображенной в гриде. А если (чур меня) будут проблемы с блокировками - совсем плохо.А это уже задачи клиента igorolv4) Реализация разного рода инкрементальных локаторов в случае постраничной загрузке будет все же подтормаживать "радуя" тем самым пользователя. [Инкрементальный локатор - это когда мы в поле ввода нажимаем "И" + "В" + "А" + "Н" + "О" + "В". и в процессе нажатия на клавиши постепенно отбираем Иванова.] Тут все-таки придется выполнять по запросу на каждое нажатие клавиши - а тут можно не успеть за пользователем. IMHO, это проблема дизайна - поскольку подобный интерфейс преррогатива клиентского приложения, то и позволять выполнять подобные вещи для больших таблиц следует только после того, как пользователь наложил на выборку некие предварительные ограничения. igorolv5) Дизайн-соображение: подозреваю, что как минимум некоторые пользователи предпочтут подождать пару секунд (но не более) при открытии формы, чем ждать по 0.3 секунды (которая может растянуться) при переходе с очередной сотни записей на другую.Думаю, что большинство предпочтет обратное :-) igorolv6) Не очень представляю, как постраничная загрузка может гармонично (как негармонично - вполне представляю :)) сочетаться с гридом, в котором есть древовидная колонка (ID - PARENT_ID).Не понял вопроса. Есть дерево, есть список. В дереве в первый момент показываем первый уровень, при необходимости подтягиваем ветку, которую пользователь раскрывает. Кстати, кроме, пожалуй, справочников, связанных с географическими пунктами или с оргструктурой предприятий других потребностей в организации дерева я не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 17:41 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolv PL99Однажды представитель одного заказчика выразил, на мой взгляд, довольно верную идею - "пусть будет безобразно, но однообразно" :-) IMHO, однообразие того стоит и в этом смысле мне нравится "жесткий процедурный API" У цитаты есть и продолжение безобразно делать мы уже научились :) Однообразие в данном случае - вовсе не обязательно "процедурный API", скорее - единое хранилище sql-кода в системе (с определенными оговорками). Ок, не буду спорить :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 17:42 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
no-userА где и как хранится этот код Хм. Так же, как и во всех остальных случаях. no-userи как две группы разработчиков его используют? Как любую библиотеку или общий модуль. no-userВозьмем, к примеру, две группы Дельфи и PHP кодеров. Зачем мне нужны две эти группы в одном проекте? Специально, чтобы создать себе геморрой? Есть куда более простые способы сделать приложение с двумя мордами. no-userЧто они делают с этим кодом, copy/paste в два разных приложения? Нет, используют. Даже в такой извратной постановке задачу скорее всего можно решить (я не знаю возможности PHP и не возьмусь уверенно утверждать). Решение, скорее всего, будет примерно столь же извратным, как и постановка. no-user использование разработчиками интерфейсов только вызовов ХП решает две проблемы: 1) нельзя сделать одну бизнес операцию двумя разными способами: разработчик интерфейса может пользоваться лишь тем, что ему дали в руки Использование общей библиотеки решает эту проблему как минимум не хуже. no-user 2) документация: API к БД - это - названия ХП типа orderCreate,orderSelect, ,orderItemAdd, orderItemUpdate Не хочется усиливать беседу, ограничусь тем, что общая библиотека опять же - решает эту задачу как минимум не хуже. no-userЕсли бизнес процедура не реализована в ХП - ее нельзя использовать (и разработчик интерфейса не может copy/paste чужой SQL код в свой PHP скрипт). Хм. Вы другие языки знаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 17:48 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
igorolvЭто если 0.1-0.3 секунды. А если программа начинает его НЕ выдерживать Согласен. igorolvА достаточно посмотреть на то, как предлагается реализовывать неполный фетч в MS SQL Посмотрел. Честно говоря, меня это крайне удивило, поскольку по моим воспоминаниям, в форуме дельфи тема всплывала неоднократно, и вроде бы ответы не предусматривали таких сложностей. Из всего названного в FAQ нормально выглядит только четвертый способ. Но судя по комментариям, он глючит :( igorolvЯ и хотел указать, что в данном случае требуется специальный подход. Там требуется не столько специальный подход, сколько непоследовательная навигация по дереву. Да, конечно, в этом случае страничное чтение малоосмысленно. Наверное, можно привести и другие примеры такого рода, например трассировка каких-нибудь проводок. А чтение дерева отдельными запросами просто является лучшим решением по цена/качество. Сложность не слишком больше, а возможности возрастают очень значительно, трюков и геморроя становится куда меньше. igorolv softwarerХм. Мне казалось, что с этим у MSSQL проблема, разве нет? Самописное решение, прикрученное к сборкам и прогонам тестов. Ну, самописное решение легко применить к чему угодно. Пожалуй даже к клиентскому коду легче; написать подпрограмму, которая пробежит по всем data module и сделает open каждому датасету наверное легче, чем вызвать каждую ХП с правильными параметрами (здесь мы пользуемся тем, что в датасетах, по крайней мере дельфовых, легко забить значения параметров в дизайн-тайме). igorolvВ меня, все же, вселяет некоторое спокойствие знание, что все 200.000 строк серверного кода, при активном изменении различных таблиц, процедур и функций ВСЕГДА 1) компилируется 2) при запуске на mock-базе не ломается 3) проходит все тесты 4) соответствует принятым внутри группы sql-конвенциям. Вы плавно переходите к тестированию и контролю качества. Тут уже ответ будет - прогоняем автоматизированные тесты, и проверяем не только компилируемость серверного кода, но и еще кучу вещей. Названная изначально проверка синтаксической корректности серверного кода оказывается далеко позади. igorolvА динамический sql все же БЫВАЮТ ситуации когда работает неэффективнее статического. Безусловно. Тут вопрос свободы выбора: то ли мы можем выбирать свободно, то ли скованы умениями ХП. В результате некоторые приходят к очень веселым (с моей точки) зрения вариантам вида Код: plaintext 1. 2. 3. 4. 5. Смысла в такой хранимке, с моей точки зрения...... то самое единообразное безобразие. Ну и о компилируемости в условиях меняющейся таблицы все равно ничего не скажешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:02 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
PL99Кстати, кроме, пожалуй, справочников, связанных с географическими пунктами или с оргструктурой предприятий других потребностей в организации дерева я не вижу. Хм. В одном из проектов я имел дело с классификатором товарных позиций примерно на миллион позиций (точнее, их всего было порядка миллиона, меня интересовало намного меньше, тысяч тридцать). Для моей задачи для работы с ним хватало дерева, для миллиона вообще говоря дерева очень мало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:06 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Использование общей библиотеки решает эту проблему как минимум не хуже. а какие языки вы можете указать, которые: 1) пригодны для разработки толстого клиента win32 2) пригодны для разработки Web клиента 3) могут использовать общие бибилиотеки? Мне что то кроме Java в голову ничего не приходит. Неужто вы на java интерфейсы строите? softwarer Хм. Вы другие языки знаете? Да я даже PHP не знаю -) Это просто примеры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:09 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer igorolv Это уже вопрос, используется в проекте или нет постраничная выборка. У этого решения есть как свои плюсы (скорость), так и минусы (более сложно для реализации, Ээ... не понял. Мне казалось, это везде делается автоматически. Можно конкретный пример, как это сделать постраничный вывод без больших затрат на Oracle? В самом общем виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:10 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerВопрос "преимущества и недостатки унифицированного подхода против преимуществ и недостатков индивидуально подхода" - классический, вечный вопрос любой инженерной профессии. Имеет он и достаточно универсальный ответ: чем ниже технологический уровень изделия, тем более оправдана унификация и наоборот, чем выше требования к качеству результата, тем тщательнее нужно подходить к каждой детали. Качество результата - вещь весьма спорная, и не раз обсуждалась на этом форуме. Мне кажется, что качественным следует признать разработку, удовлетворяющую требованиям ТЗ. Дополнительное вылизывание кода, как правило, приводит к значительному росту сроков и себестоимости проекта. Однако, я не исключаю, что некоторые части проекта могут разрабатываться на совершенно других принципах, чем, скажем так, принятый в качестве mainstream для большинства разработок. softwarerЖесткий процедурный API в общем случае не позволяет получить изделие приемлимого с моей точки зрения качества. Что для меня закрывает вопрос о нем как о единственном и универсальном методе.Мы опять вернулись к понятию "качество". softwarerРабота у него остается ровно та же самая: визуализировать данные, отстроить пользовательский интерфейс, в нужные моменты вызывать указанные методы. Что внутри этих методов - ХП или "запросы с клиента" - заведомо не должно его волновать, это базовый принцип инкапсуляции. Ок, будем считать, что в прошлый раз я вас неправильно понял :-) softwarerНа какую дальнейшую разработку? Один разработал, другой использует, совершенно нормальная картина. Хотя уже в рамках другого вопроса - я полагаю неправильной ситуацию, когда каждый программист занимается только своим куском и не способен подхватить чужие.Это другой вопрос и по нему с вашей позицией я полностью согласен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:15 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
no-userМне что то кроме Java в голову ничего не приходит. Во-первых, мелкософтовская линейка во главе с C#. Во-вторых, библиотеки на C подключаются к чему угодно (по крайней мере, я до сих пор не сталкивался с исключениями). К Java можно подключить любую dll, соответственно писать веб на яве, толстого клиента на чем угодно. Наконец, веб можно свалять и на дельфе; результат конечно будет не то чтобы выдающимся, но веб все равно хорошим не бывает. no-userНеужто вы на java интерфейсы строите? Не, это удовольствие не по мне. Хотя есть любители, и проект с такими требованиями, вполне возможно, я бы им и саутсорсил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:17 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Guest 0310Можно конкретный пример, как это сделать постраничный вывод без больших затрат на Oracle? В самом общем виде. Открыть курсор. Взять из него 50 записей. Когда потребуется, взять следующие 50 записей. Далее по индукции. Затрат совершенно никаких. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:21 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
PL99Качество результата - вещь весьма спорная, и не раз обсуждалась на этом форуме. Я не предлагаю его обсуждать. Я просто констатирую, что выбор подхода зависит от требуемого качества - в том числе от того, что понимается под качеством в конкретном случае. PL99Мы опять вернулись к понятию "качество". Да, но уже чуть в другом аспекте - том, где я (как технолог) являюсь пользователем и ставлю задачу. Как факт, я сталкиваюсь с пожеланиями пользователей, реализация которых в концепции "все на ХП" приводит к ряду проблем, в том числе упомянутых в этом обсуждении. Как факт, я иногда стимулирую пользователей к таким пожеланиям, поскольку знаю, что они оценят предоставляемые удобства, и это даст существенную экономию в других вопросах (довольный пользователь - человек, с которым приятно и выгодно иметь дело. Поэтому имеет смысл уметь радовать его дешево). Поэтому лично для меня технология "все на ХП" как унифицированный подход, как заведомый выбор для любого проекта, неприемлима. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:28 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer PL99Кстати, кроме, пожалуй, справочников, связанных с географическими пунктами или с оргструктурой предприятий других потребностей в организации дерева я не вижу. Хм. В одном из проектов я имел дело с классификатором товарных позиций примерно на миллион позиций (точнее, их всего было порядка миллиона, меня интересовало намного меньше, тысяч тридцать). Для моей задачи для работы с ним хватало дерева, для миллиона вообще говоря дерева очень мало.Хм ;-) Древовидный классификатор товаров - вещь довольно распространенная, но связана с тем, что постановщики не разобрались в бизнес-процессе и предложили универсальное решение, а о качестве универсальных решений вы недавно отзывались не очень-то восторженно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:31 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Я не очень понимаю о чем Вы. У меня использовалось дерево потому (и именно потому), что это было требованием пользователей к моему проекту. Классификатор в целом был фасетным, отнюдь не древовидным. О качестве же универсальных решений я отзывался "всему свое место" - согласен, что это "не слишком восторженно". Насчет преимуществ и недостатков иерархического классификатора в бизнес-процессе не могу судить, мало сталкивался да и неинтересно особо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 18:39 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Guest 0310Можно конкретный пример, как это сделать постраничный вывод без больших затрат на Oracle? В самом общем виде. Открыть курсор. Взять из него 50 записей. Когда потребуется, взять следующие 50 записей. Далее по индукции. Затрат совершенно никаких. Именно так и работает Forms, только он еще и назад отматывать умеет без чтения БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 12:51 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
"В кругах, в которых я имею обыкновение вращаться" так работает практически любой инструмент, далеко не только Forms. Включая, разумеется, и двунаправленность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 13:12 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
+ в копилку процедурного подхода При изменении процедуры на сервере (в одном месте) все клиенты автоматически работают по новой/измененной логике. В случае хранения запросов на клиенте придется на всех рабочих местах менять клиентскую часть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 14:21 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
casmithПри изменении процедуры на сервере (в одном месте) все клиенты автоматически работают по новой/измененной логике. Особенно когда у процедуры меняется список параметров. casmithВ случае хранения запросов на клиенте придется на всех рабочих местах менять клиентскую часть. А именно после коннекта скачать из той же базы последнюю версию dll-ки. Тогда уж давайте и в минусы процедурного подхода : ради наката тривиального патча приходится выгонять из системы пользователей либо рисковать нарушением целостности БД. В случае Oracle возникают дополнительные проблемы с инвалидацией серверного кода и состоянием переменных в пакетах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 14:42 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > Тогда уж давайте и *в минусы процедурного подхода*: ради наката > тривиального патча приходится выгонять из системы пользователей либо > рисковать нарушением целостности БД. В случае Oracle возникают > дополнительные проблемы с инвалидацией серверного кода и состоянием > переменных в пакетах. С другой стороны - я имею возможность ГАРАНТИРОВАНО накатить патч, пусть даже отрубанием всех юзеров. Юзер подключится заново - и всё работает правильно. А если надо ему еще клиента нового спихнуть - возможны варианты :-). Кроме того, поясните мне, почему в случае обновления функционала "документ А", я должен ВСЕМ раздавать нового клиента? Даже тем, кто про данный документ не знает? Или - дробить клиента на милипусенькие кусочки? и нафига мне такой гемор? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 15:30 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
lockyС другой стороны - я имею возможность ГАРАНТИРОВАНО накатить патч, пусть даже отрубанием всех юзеров. Юзер подключится заново - и всё работает правильно. А если надо ему еще клиента нового спихнуть - возможны варианты :-) Поддержу. Проще обновить в одном месте, чем во многих. softwarerТогда уж давайте и в минусы процедурного подхода: ради наката тривиального патча приходится выгонять из системы пользователей либо рисковать нарушением целостности БД. Т.е. если у нас функционал в клиентских dll-ках пользователей выгонять не надо ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 15:42 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
lockyС другой стороны - я имею возможность ГАРАНТИРОВАНО накатить патч, пусть даже отрубанием всех юзеров. Эта возможность есть всегда. А вот отрубание юзеров без необходимости - довольно паршивое занятие. Разумеется, где-то проблем нет, но где-то и очень неприятно. lockyЮзер подключится заново - и всё работает правильно. А если надо ему еще клиента нового спихнуть - возможны варианты :-) Поскольку ХП вовсе не избавляют от "еще клиента нового спихнуть" - разницы немного. lockyКроме того, поясните мне, почему в случае обновления функционала "документ А", я должен ВСЕМ раздавать нового клиента? Даже тем, кто про данный документ не знает? Кто Вам сказал такую глупость? Это был не я. lockyИли - дробить клиента на милипусенькие кусочки? и нафига мне такой гемор? Для достаточно большого приложения дробить на функциональные модули - практически технологическая необходимость. На одной из моих работ этому очень долго сопротивлялись, и я наглядно наблюдал эффективность различных вариантов. После того, как мне наконец удалось в одном проекте пропихнуть правильную с моей точки зрения технологию, и начальство увидело разницу - все следующие проекты делались именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 15:50 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovТ.е. если у нас функционал в клиентских dll-ках пользователей выгонять не надо ? Чаще всего не надо. Отмечу, что я не слишком согласен с употреблением здесь слова "функционал". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 15:55 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > locky > Юзер подключится заново - и всё работает правильно. А если надо ему еще > клиента нового спихнуть - возможны варианты :-) > > Поскольку ХП вовсе не избавляют от "еще клиента нового спихнуть" - > разницы немного. При неизменной декларации входных-выходных параметров - избавляет. Меняется только функциональный код. Новый клиент - не нужен. > > locky > Или - дробить клиента на милипусенькие кусочки? и нафига мне такой гемор? > > Для достаточно большого приложения дробить на функциональные модули - > практически технологическая необходимость. На одной из моих работ этому > очень долго сопротивлялись, и я наглядно наблюдал эффективность > различных вариантов. После того, как мне наконец удалось в одном проекте > пропихнуть правильную с моей точки зрения технологию, и начальство > увидело разницу - все следующие проекты делались именно так. Согласен. Дробить. До какого предела? чтобы при обновление выбора списка документов в "документе а" не надо было раздавать клиента. Выносим "грид списка документов" в отдельный длл, его динамически выгружаем/загружаем? Не шибко сложно? зы у меня ок. 400 типов документов благополучно живут в одном унифицированном интерфейсе. за 1.5 года при изменении функционала документов ни разу не понадобилось обновлять клиента - всё укладывалось на серваке. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 15:55 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
lockyПри неизменной декларации входных-выходных параметров - избавляет. Не совсем точно, но в целом соглашусь. Именно. При подходе "все на ХП" это требование чаще всего не выполняется. При подходе "разумного использования ХП" это требование чаще всего выполняется. Давайте рассмотрим два примера изменений: добавление в таблицу нового малозначимого поля (например, "комментарий") и изменение например логики учета какого-то документа. В случае "все на ХП" первый пример требует изменения таблицы на сервере, ХП на сервере (включая параметры 1 ) и изменения клиента. Второй пример требует изменения ХП на сервере, скорее всего без изменения параметров. В случае "часть sql-кода на клиенте" первый пример требует изменения таблицы на сервере и изменения клиента. Второй пример - как и в предыдущем случае, ХП на сервере. Таким образом, в случае "часть sql-кода на клиенте" оба патча могут быть сделаны на живой базе. В случае "все на ХП" первый из них потребует выгонять пользователей. Другой разницы между примерами нет. lockyСогласен. Дробить. До какого предела? Думаю, здесь невозможно сформулировать простое и универсальное правило. По сути, этот вопрос эквивалентен вопросу "что есть модуль", да и в целом вопрос - на поиск нечеткой границы. С моей точки зрения, критерий классический: набор функций, которые чаще всего используются совместно, тесно связаны друг с другом и относительно слабо связаны с другими функциями приложения. На практике оказывается, что такое разбиение в целом соответствует объектам раздачи прав [не знаю, как бы это удачно сформулировать]; если в администрировании предусмотрены элементарные роли A, Б и В (элементарные - то есть не содержащие других ролей), то разбиение на А.dll, Б.dll и В.dll в большинстве случаев будет неплохим выбором. Разумеется, есть детали - например, права на редактирование справочников идут отдельно, но общий принцип в целом такой. lockyзы у меня ок. 400 типов документов благополучно живут в одном унифицированном интерфейсе. за 1.5 года при изменении функционала документов ни разу не понадобилось обновлять клиента - всё укладывалось на серваке. Скажем так, для тех решений такого рода, которые я видел и щупал, качество меня не устраивало. Либо в части результата (откровенно убогие формы) либо в части сложности движка, удобства разработки этих форм итп. Но это уже переход к отдельной теме, которая много раз обсуждалась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 16:19 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
lockyзы у меня ок. 400 типов документов благополучно живут в одном унифицированном интерфейсе . за 1.5 года при изменении функционала документов ни разу не понадобилось обновлять клиента - всё укладывалось на серваке.У Вас условно-тонкий клиент (я позволю себе ввести такой термин :-)) У меня, вероятно, тоже нечто похожее. Но уважаемого sotwarer не удовлетворяет качество конечного продукта при использовании унифицированного подхода, отсюда и весь этот флейм ;-) Хотя, я полагаю, что во всех случаях речь идет о некой технологии, которая, при необходимости, позволяет провести "тонкую" доработку/разработку любым традиционным способом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 16:21 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
PL99У Вас условно-тонкий клиент (я позволю себе ввести такой термин :-)) Я бы сказал, "серверно-конфигурируемый клиент". На определенном уровне абстракции все то же самое, но существенная количественная разница связана с тем, что обновление клиента требуется при доработке движка, а не при доработке прикладных форм, соответственно происходит много реже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 16:26 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
2 softwarer Большинство ваших возражений против "все через ХП" выглядят как "всегда есть ситуация, когда без ХП будет ничуть не хуже". И с этим нельзя не согласится. И я полностью согласен с тем, что работа через ХП в принципе не быстрее. Что строить фильтрацию черех них - громоздко и неудобно. Кстати, 2 igorolv авторДело в том, что конструкция "x.ID = @ID or @ID is null" оптимальнее, чем x.ID = isnull(@ID, ID). Так как некоторые оптимизаторы(MSSQL2005) в ДАННОМ КОНКРЕТНОМ случае "подменяют or на union". Вы сами-то проверяли данное утверждение? На 4-5 условиях OR? Или это надежда? :) ИМХО, насколько я помню, декларировалось только, что оптимизатор МОЖЕТ это делать в некоторых случаях) Но вот с последним утверждением я не согласен авторНа практике оказывается, что такое разбиение в целом соответствует объектам раздачи прав [не знаю, как бы это удачно сформулировать]; если в администрировании предусмотрены элементарные роли A, Б и В (элементарные - то есть не содержащие других ролей), то разбиение на А.dll, Б.dll и В.dll в большинстве случаев будет неплохим выбором Элементарное разбиение на права - это в общем случае, может быть разбиение до операций. Т.е. в примере locky - как раз те самые 400 модулей, по документу в модуле. Насколько это оправдано технологически - не мне вам обьяснять. Предположу больше - ХП практически всегда больше, чем функциональных модулей на клиенте. Возможно, вы найдете какой-то хитрое исключение из вашей практике, но это будет именно исключение. Отсюда следует, что изменение одного модуля на клиенте затронет больше функционала. Я вовсе не призываю становится по знамена "все только через ХП". Однако, как мне кажется - в большинстве "обычных" клиент-серверных систем, наиболее эффективным является сведение SQL кода на клиенте к простейшему минимуму. Т.е. выведение любых более-менее сложных запросов либо через ХП, либо через view. Отдельной строкой здесь стоят ИС, поддерживающие различные серверные платформы, но там требования совместимости перевешивают все остальное. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 16:49 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > PL99 > У Вас условно-тонкий клиент (я позволю себе ввести такой термин :-)) > > > Я бы сказал, "серверно-конфигурируемый клиент". На определенном уровне > абстракции все то же самое, но существенная количественная разница > связана с тем, что обновление клиента требуется при доработке движка, а > не при доработке прикладных форм, соответственно происходит много реже. +1 Да, некоторые документы не слишком "гладко" ложаться на движок, но этим жертвуем в пользу унификации. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 17:11 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Alexey KudinovТ.е. если у нас функционал в клиентских dll-ках пользователей выгонять не надо ? Чаще всего не надо. Отмечу, что я не слишком согласен с употреблением здесь слова "функционал". Ну давайте уточнять. Есть некий select, который возвращает сумму А и сумму Б, как 20% от суммы А. Но программист неправильно написал select и Б получается как 2% Вариант 1 - этот select прописан на сервере в ХП Вариант 2 - этот select прописан на клиенте в dll В обоих вариантах этот расчет используют 100 пользователй С моей т.з., для исправления ошибки в варианте 1 пользователей выгонять не обязательно, хотя и не плохо бы. В варианте 2 нужно все 100 выгнать, тем или иным способом обновить всем эту библиотеку и только потом продолжать работу. А как считаете вы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 17:22 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
aagЭлементарное разбиение на права Мне кажется, Вы не обратили внимание - я говорил не об элементарных правах, а об элементарных ролях. Действительно, если говорить о единичных правах, разбиение легко может получиться мельче, чем было бы оптимально. aag- это в общем случае, может быть разбиение до операций. Т.е. в примере locky - как раз те самые 400 модулей, по документу в модуле. Насколько это оправдано технологически - не мне вам обьяснять. Это оправдано куда как больше, нежели 400 документов в одном exe-шнике ;) При столь подробных входных данных, сами понимаете, трудно судить об оптимуме. В конце концов, документ бывает и бумажкой на одну простую форму, а бывают такие документы, что для их ввода я делал отдельное приложение и писал его три месяца. Если же говорить о технологии... цифра "400 модулей" сама по себе меня совершенно не пугает, модульная технология отлично масштабируется. Просто не приходилось проектировать приложение таких размеров; потребуется - будет интересно. aagОтсюда следует, что изменение одного модуля на клиенте затронет больше функционала. Это несколько бессмысленная фраза, имхо. Для иллюстрации удобно воспользоваться оракловым понятием пакета. Допустим, у нас есть 400 ХП. Мы можем сделать их независимыми, можем сгруппировать, например, в 40 пакетов. Если требуется изменить одну ХП - мы по-прежнему меняем одну ХП. Во втором случае при этом перекомпилируется один пакет (одно тело пакета), что "затрагиванием" можно назвать очень условно, проблем от этого никаких. aagЯ вовсе не призываю становится по знамена "все только через ХП". Однако, как мне кажется - в большинстве "обычных" клиент-серверных систем, наиболее эффективным является сведение SQL кода на клиенте к простейшему минимуму. Т.е. выведение любых более-менее сложных запросов либо через ХП, либо через view. Абсолютно согласен. На клиенте стоит оставлять простые запросы, ну и средства динамического конструирования запросов, в том числе фильтры. aagОтдельной строкой здесь стоят ИС, поддерживающие различные серверные платформы, но там требования совместимости перевешивают все остальное. Мне таких писать не доводилось. В целом есть некое представление о том, как я бы попробовал такое делать, но сугубо теоретическое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 17:29 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovВариант 1 - этот select прописан на сервере в ХП Вариант 2 - этот select прописан на клиенте в dll С моей т.з., для исправления ошибки в варианте 1 пользователей выгонять не обязательно, Тогда мы ставим под угрозу целостность БД. Почему: потому что этот селект может выполняться несколько раз в рамках одной бизнес-операции, одной транзакции. Также транзакция может существенно зависеть от его согласованности с другим элементом серверного кода, корректируемым в том же патче. Насколько мне известно, понятие уровней изоляции обычно не распространяется на ddl, то есть если мы поменяли ХП - начиная с этого мига текущие транзакции начинают использовать новую ХП. Соответственно, состояние данных по завершении транзакции просто непредсказуемо. Здесь я полагаю, что транзакция часто состоит более чем из одной ХП, включая вложенные вызовы. Конечно, если каждая транзакция - это вызов одной ХП, не вызывающей никаких других ХП и триггеров, соображение не действует, но я нетривиальных систем такой архитектуры не видел, а если и увижу, вряд ли назову хорошими. Именно поэтому я полагаю, что выгонять пользователей в этом случае строго обязательно [ну или как минимум - кто-то из ведущих разработчиков, отлично знающий всю систему целиком, должен трижды подумать и торжественно дать зуб, что проблем теоретически не может возникнуть]. Как я упоминал, у Oracle в этом случае есть еще и технические особенности, также стимулирующие такое решение, но это уже его персональные детали, а вот предыдущее соображение, полагаю, универсально. Alexey Kudinovхотя и не плохо бы. В варианте 2 нужно все 100 выгнать, Зачем именно? Безусловной необходимости в этом я не вижу. Хм. Я попробовал детально расписать варианты этой ситуации, и обнаружил, что получается пост очень нехилых размеров. Не готов сейчас столько писать :( Ключевой вопрос, который надо рассмотреть именно в случае патча на исправление ошибки - починка некорректных данных, которые уже лежат в БД, и тут начинается куча вариантов. Поэтому приведу простой пример - если это расчет, не требующий немедленных действий, скажем отчет о дебиторской задолженности, выгонять пользователей ну совершенно необязательно. Реально очень во многих случаях достаточно сказать пользователю: обновишься - начнешь работать по-новому, делай это когда тебе будет удобно. Также отметим, что хотя это некое излишество, но в клиента легко можно встроить механизм онлайнового апдейта по оповещению, и выгонять пользователей в этом случае также совершенно не потребуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 18:18 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > же патче. Насколько мне известно, понятие уровней изоляции обычно не > распространяется на ddl, то есть если мы поменяли ХП - начиная с этого > мига текущие транзакции начинают использовать новую ХП. Соответственно, > состояние данных по завершении транзакции просто непредсказуемо. в MS SQL DDL можно выполнять в serializable. тулзы от MS так и делают. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 18:30 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
авторМне кажется, Вы не обратили внимание - я говорил не об элементарных правах, а об элементарных ролях. Каюсь, не обратил. С ролями еще хуже - ибо в отличии от прав, само понятие роли может быть переменчиво. Сегодня наша роль включает такие-то права, а завтра - мы расширяем ее, или разбиваем ее на две или еще что-то. Причем связь с функционалом здесь... скажем так, она есть, но может быть очень косвенной. авторЭто оправдано куда как больше, нежели 400 документов в одном exe-шнике ;) При столь подробных входных данных, сами понимаете, трудно судить об оптимуме. Как вы любите писать " я легко могу представить обратный пример..." :) В самом деле, здесь могут быть самые разные ситуации и один ехе-шник на 400 документов - не похож на оптимальное решение. Но, для большинства случаев, в предположении хотя бы минимального наследования - иметь даже одну библиотеку мне кажется несколько более эффективным, чем 400 отдельных. авторЭто несколько бессмысленная фраза, имхо. Для иллюстрации удобно воспользоваться оракловым понятием пакета Я недостаточно знаком с оракловым понятием пакета; фраза о функционале возникла в предположении что одна ХП выполняет одну функциональную операцию (отчет, проводка и т.п.) В более сложных ситуациях, этих ХП может быть несколько, но предполагаем что время прописывания всего этого пакета невелико и им можно пренебречь. В тоже время функционал одного модуля - опять же, как правило, для большинства случаев - содержит несколько функциональных операций, пусть даже связанных. Следовательно, его замена в среднем может оказать более критична/неудобна. Еще раз хочу подчеркнуть - поскольку требования на разработку могут быть практически сколь угодно фантастическими, поскольку решаемые ситуации могут быть просто непредсказуемыми, я пытаюсь рассуждать о неком обширном пласте "обычных" ИС. С более-менее типовыми задачами. Отдельно хочется заметить - ваше рассуждение о том авторчем ниже технологический уровень изделия, тем более оправдана унификация и наоборот, чем выше требования к качеству результата, тем тщательнее нужно подходить к каждой детали. конечно, правильно, но... если надежность изделия (причем любого) сильно зависит от тщательности обработки его каждой детали, надежность выпуска таких изделий невысока. В приложении к этому спору - заранее отказываясь от любых ограничений в используемых программных решениях (там - ХП, сям - обработка на клиенте, а здесь вообще 3-й слой) мы можем получит большую эффективность, но она сильно будет зависить от опыта конкретного разработчика. Как мне кажется, такой подход удобен при разработке маленькой командой; для более крупных отделов - довольно опасно. авторМне таких писать не доводилось. В целом есть некое представление о том, как я бы попробовал такое делать, но сугубо теоретическое. Мне приходилось (на Оракле :)) и не понравилось. Об эффективности приходилось забывать и к тому решать массу странных проблем. авторТогда мы ставим под угрозу целостность БД. В общем случае - согласен авторПоэтому приведу простой пример - если это расчет, не требующий немедленных действий, скажем отчет о дебиторской задолженности, выгонять пользователей ну совершенно необязательно Довольно странно - почему-то для ХП вы сразу предполагаете угрозу целостности БД. (правильнее, впрочем целостности функционала). А для клиента допускаете что эта угроза может быть необязательной. А с моей точки зрения обе описанные вами ситуации ну ничем абсолютно не различаются. Точно также можно предположить, как из незамененного клиентского модуля уйдут на сервер 2% вместо 20%, и точно также, что эта ХП возвращает отчет по дебиторской задолженности. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 18:52 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerТогда мы ставим под угрозу целостность БД. Почему: потому что этот селект может выполняться несколько раз в рамках одной бизнес-операции, одной транзакции. Также транзакция может существенно зависеть от его согласованности с другим элементом серверного кода, корректируемым в том же патче. В т.ч. и поэтому я написал, что пользователей хорошо бы выгнать. Можно однако спорить (фактически беспредметно) о том, как часто встречается описанная вами ситуация. Ну и lockyв MS SQL DDL можно выполнять в serializable. тулзы от MS так и делают softwarerПоэтому приведу простой пример - если это расчет, не требующий немедленных действий, скажем отчет о дебиторской задолженности, выгонять пользователей ну совершенно необязательно. Реально очень во многих случаях достаточно сказать пользователю: обновишься - начнешь работать по-новому, делай это когда тебе будет удобно :) опять же (достаточно беспредметно) можно спорить о том насколько часто важно, чтобы один и тот же расчет на основании одних и тех же данных но у разных пользователей приводил к одним и тем же результатам. Мне кажется, что возможные коллизии в этом случае возникают чаще. Но опять таки без конкретного примера говорить не о чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 19:04 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
aag igorolvДело в том, что конструкция "x.ID = @ID or @ID is null" оптимальнее, чем x.ID = isnull(@ID, ID). Так как некоторые оптимизаторы(MSSQL2005) в ДАННОМ КОНКРЕТНОМ случае "подменяют or на union". Вы сами-то проверяли данное утверждение? На 4-5 условиях OR? Или это надежда? :) ИМХО, насколько я помню, декларировалось только, что оптимизатор МОЖЕТ это делать в некоторых случаях) Проверял. MS SQL 2005. На достаточном количестве or и достаточном количестве хранимок. Правда, использование было сплошь в однотипных ситуациях. Вариантов несколько: 1) x.ID = isnull(@ID, ID) 2) (x.ID = @ID or @ID is null) Вне зависимости от числа необязательных параметров , выявилось следующее: а) если параметр УКАЗАН (выполняется x.ID = @ID), то эффективнее Вариант1. б) если параметр НЕ УКАЗАН (выполняется @ID is null), то эффективнее Вариант2. Критично уменьшить время выполнения запроса, когда параметр НЕ УКАЗАН. Так как если этот параметр УКАЗАН, объем выборки уменьшается, следовательно, оптимальность запроса менее важна (Он и так быстро выполняется - грузит меньше). Следовательно, при использовании необязательных фильтрующих параметров в хранимых процедурах MS SQL 2005, используемых для загрузки данных, выгоднее использовать вариант (x.ID = @ID or @ID is null) Однако, хочется подчеркнуть, что входные параметры хранимой процедуры, в том числе необязательные, следует использовать прежде всего для отбора необходимых данных, а не для выстраивания ПОЛНОЦЕННОГО механизма фильтрации. При ТРЕБОВАНИИ использования только хранимых процедур для доступа к данным, решать проблему именно ФИЛЬТРАЦИИ на мой взгляд, предпочтительнее с помощью связок "фильтры на клиенте в dataset-е" ПЛЮС "динамический sql в связке с метаданными". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2006, 21:13 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovВ т.ч. и поэтому я написал, что пользователей хорошо бы выгнать. Можно однако спорить (фактически беспредметно) о том, как часто встречается описанная вами ситуация. Спорить о частоте я не вижу смысла, заранее готов согласиться с "редко", "очень редко" итп. Вопрос - в последствиях такой коллизии, если она все же возникнет. Опять же я заранее согласен с тем, что мой подход с точки зрения "среднего программиста" изрядно параноидален. Причина этого в том, что во-первых, надежность софта - вообще одна из моих любимых тем, а во-вторых, я имею неплохой опыт разгребания последствий подобных проблем, и что самое главное - профилактики оных. Я на собственной шкуре знаю, сколько работы приходится сделать для ликвидации последствий таких вот нечасто встречаемых ситуаций, и насколько меньше усилий требуется, чтобы вычистить проблему прежде чем она по-настоящему заявит о себе. Alexey Kudinov Ну и lockyв MS SQL DDL можно выполнять в serializable. тулзы от MS так и делают Наверное, я не компетентен оценить все последствия, но на первый взгляд это не является лекарством от описанной проблемы. Нужно другое - нужно, чтобы транзакция с уровнем изоляции, например, RC, видела хранимки так, как должна была бы видеть их в SERIALIZABLE. Alexey Kudinovможно спорить о том насколько часто важно, чтобы один и тот же расчет на основании одних и тех же данных но у разных пользователей приводил к одним и тем же результатам. Если один из этих пользователей знает, что работает в устаревшей версии - имхо заведомо неважно. Но опять же незачем спорить - если помните, мы обсуждаем безоговорочную необходимость выгнать пользователей в этом случае. Если тема свелась к "насколько часто" - значит, безоговорочной необходимости нет. Ну а обсуждать на пальцах количественные показатели в данном случае, полагаю, бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 09:20 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
2 softwarer все-таки aagДовольно странно - почему-то для ХП вы сразу предполагаете угрозу целостности БД. (правильнее, впрочем целостности функционала). А для клиента допускаете что эта угроза может быть необязательной. А с моей точки зрения обе описанные вами ситуации ну ничем абсолютно не различаются. Точно также можно предположить, как из незамененного клиентского модуля уйдут на сервер 2% вместо 20%, и точно также, что эта ХП возвращает отчет по дебиторской задолженности. Если вы говорите softwarer надежность софта - вообще одна из моих любимых тем, а во-вторых, я имею неплохой опыт разгребания последствий подобных проблем, и что самое главное - профилактики оных. Я на собственной шкуре знаю, сколько работы приходится сделать для ликвидации последствий таких вот нечасто встречаемых ситуаций, и насколько меньше усилий требуется, чтобы вычистить проблему прежде чем она по-настоящему заявит о себе, то вы должны представлять себе что будет, если часть клиентов отправдяют в БД расчеты на основании правильных 20%, а часть нет. я думаю, мы согласимся в том, что и в случае ХП, так и в случае sql на клиенте существуют ситуации, когда одновременное обновление с отключением клиентов от БД критично и существуют ситуации когда это не обязательно. При этом где именно размещен данный sql не столь важно, важно что он делает и какие процессы затрагивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:07 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey Kudinovсуществуют ситуации, когда одновременное обновление с отключением клиентов от БД критично и существуют ситуации когда это не обязательно. softwarerЕсли один из этих пользователей знает, что работает в устаревшей версии - имхо заведомо неважно. Пожалуй, надо сказать еще пару слов. Здесь мы вступаем в несколько эфимерную область отношения пользователей к ПО. К сожалению, пользователи забывают и/или не обращают внимание даже на версию ПО, а уж на список исправлений и подавно. Человек просто печатает отчет и идет с ним к начальнику, который в своем отчете видит другие цифры. Некоторое время они выясняют кто тут дурак, а потом может быть вспомнят, что один из них не обновил свою систему. А может и не вспомнят, а начнут делать общие выводы относительно качества ПО и принимать какие-то решения. Т.е. с _технической_ точки зрения неприятных последствий нет. С точки зрения ситуации в целом - скорее есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:37 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey Kudinovвсе-таки aagДовольно странно - почему-то для ХП вы сразу предполагаете угрозу целостности БД. (правильнее, впрочем целостности функционала). А для клиента допускаете что эта угроза может быть необязательной. Хм. Мне казалось, это сказано, но видимо надо было проговорить более четко. Те проблемы целостности, о которых я говорю, возникают из-за того, что правила игры меняются посереди транзакции; половина транзакции работает "по старому", половина - "по новому". При реализации на клиенте такой ситуации возникнуть не может, ну разве что специально очень постараться. В обоих случаях также потребуется решить проблему "восстановления данных", то есть найти "некорректные по-старому данные", отделить их от "корректных по-новому" и привести в порядок. Здесь различия того и другого варианта малы, предлагаю считать эту задачу эквивалентной в обоих случаях. Я же фокусируюсь на том, что при обновлении ХП посереди транзакции может возникнуть третий вариант "данные, некорректные и не по-старому, и не по-новому, а неким труднопредсказуемым третьим образом", и поиск-лечение таких данных является отдельной непростой задачей. Alexey Kudinovто вы должны представлять себе что будет, если часть клиентов отправдяют в БД расчеты на основании правильных 20%, а часть нет. Зависит от того, как используются эти данные. Я уже сказал выше, попытался расписать детально, и обнаружил что вариантов слишком много. Alexey Kudinovсуществуют ситуации, когда одновременное обновление с отключением клиентов от БД критично .... Само собой. Alexey KudinovПри этом где именно размещен данный sql не столь важно, важно что он делает и какие процессы затрагивает. Вот с этим я уже не готов согласиться; выше, в http://sql.ru/forum/actualpost.aspx?bid=36&tid=341204&mid=3223860&p=4&act=quot#3221311 я приводил пример обратного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:48 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey Kudinov К сожалению, пользователи забывают и/или не обращают внимание даже на версию ПО, а уж на список исправлений и подавно. Человек просто печатает отчет и идет с ним к начальнику, ..... Это уже в целом проблема технологии управления, для решения которой может потребоваться поддержка со стороны софта. Если - пользователю доходчиво сообщается о выходе новой версии, например появляется крупный баннер на главной форме - налажено превентивное информирование пользователей о значимых для них изменениях; мы не полагаемся на "пользователь полезет вот сюда и прочитает вот это, выбирая нужное для себя" - пользователь знает, что за "я дурак" его по головке не погладят то такая проблема не возникает. Проверено на практике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:54 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
aagС ролями еще хуже - ибо в отличии от прав, само понятие роли может быть переменчиво..... Скажем так, "устойчивые группы" существуют. Мало того, переменчивость роли в общем-то не приводит ни к каким страшным последствиям. В общем, предлагаю сойтись на том, что найти удобное разбиение можно, но задача это неочевидная. aagв предположении хотя бы минимального наследования - иметь даже одну библиотеку мне кажется несколько более эффективным, чем 400 отдельных. Я не очень понимаю, чем 400 отдельных библиотек мешают использовать наследование. Наоборот, могут и должны его использовать; соответственно я не вижу разницы между "1 и 400 библиотек". Возможно, здесь играет роль специфика инструмента. aagЯ недостаточно знаком с оракловым понятием пакета; Пакет... если Вы не знакомы с такой концепцией, проще всего сказать, что это экземпляр класса, существующий в единственном экземпляре для каждой использующей его сессии. То есть в самом простом случае - группа ХП, оформленных как методы одного класса. aagВ тоже время функционал одного модуля - опять же, как правило, для большинства случаев - содержит несколько функциональных операций, пусть даже связанных. Следовательно, его замена в среднем может оказать более критична/неудобна. Вот этого я и не понимаю. Если мы меняем одну функциональную операцию - мы меняем одну функциональную операцию вне зависимости от того, оформлена ли она отдельным модулем или собрана в группу с несколькими другими. Мы одинаково меняем одни и те же строки. Не вижу разницы. Фактически Ваше утверждение - как я его понимаю - соответствует следующей аналогии: если мы возьмем класс, например Vector, и развалим его на отдельные stand-alone подпрограммы, модификация одной из этих подпрограмм, например indexOf, окажется проще (менее критична/неудобна) чем аналогичная модификация в рамках исходного класса. aagесли надежность изделия (причем любого) сильно зависит от тщательности обработки его каждой детали, надежность выпуска таких изделий невысока. Хм. Если обсуждать эту тему, боюсь, мы уйдем в очень далекие дебри, причем, похоже, мы сейчас говорим о несколько разном значении термина "надежность". aagКак мне кажется, такой подход удобен при разработке маленькой командой; для более крупных отделов - довольно опасно. Проблема масштабирования для проектных команд, безусловно, никак не менее сложна и интересна, чем для программных продуктов, скорее наоборот. Мне не доводилось руководить большим коллективом, а что до тех проектов, в которых участвовал в более скромных ролях - с моей точки зрения, используемые технологии могли бы очевиднейше улучшены. Скажу так, общая история развития технологии ведет не в сторону унификации сотрудников. Какой пример ни возьми, от военного дела до производства пуговиц, мейнстрим выглядит примерно так: кустарщина (неунифицированный разброд) -> начало унификации (мануфактуры, внедрение машин) -> высшая точка унификации (тот же конвеер) -> вытеснение унифицированных сотрудников сложными техническими решениями, автоматизацией; выжившие сотрудники занимаются более эксклюзивными операциями. Возьмите, например, тестирование, где дешевый ручной труд медленно, но верно вытесняется автоматизированными решениями под управлением квалифицированных специалистов. aagДовольно странно - почему-то для ХП вы сразу предполагаете угрозу целостности БД...... Нет, именно целостности данных. Подробнее уже ответил выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 12:28 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerТе проблемы целостности, о которых я говорю, возникают из-за того, что правила игры меняются посереди транзакции; половина транзакции работает "по старому", половина - "по новому". При реализации на клиенте такой ситуации возникнуть не может, ну разве что специально очень постараться. Я по прежнему не вижу принципиальной разницы. Как результат отсутствия своевременного обновления новые "правильные" клиенты могут в своей работе использовать данные введенные "неправильными" и наоборот. В данном случае не суть важно, меняются ли правила игры посередине транзакции или посередине одновременной работы различных пользователей с одними данными. Бардак будет и в том и в ином случае. Замечу еще, что растянутость процесса обновления во втором случае способствует бОльшей рассогласованности данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 12:36 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerТе проблемы целостности, о которых я говорю, возникают из-за того, что правила игры меняются посереди транзакции Ну а если, например, правила игры меняются не внутри серверной транзакции, но посреди бизнес-операции? Целостность данных - да, формально нарушена может быть не будет. А вот логически - с точки зрения бизнеса - ошибки могут быть точно такие же. Допустим, что пресловутые 20% ведутся в одной таблице. Тогда какая разница в транзакции ли я вместо 20% взял 2% или нет? Но важно, что возникает вероятность, что в непредсказуемой части данных будут одни проценты, а в части другие. Отсутствие транзакции просто переводит проблему на другой уровень. softwarer- пользователю доходчиво сообщается о выходе новой версии, например появляется крупный баннер на главной форме - налажено превентивное информирование пользователей о значимых для них изменениях; мы не полагаемся на "пользователь полезет вот сюда и прочитает вот это, выбирая нужное для себя" - пользователь знает, что за "я дурак" его по головке не погладят А как же авторЛично я не люблю решать административно задачи, легко решающиеся технически ??? Ведь тут вы практически полагаетесь на разумность и аккуратность пользователя, причем в таком случае, когда этого делать никак не следует. У пользователя, как правило, полным-полно своих забот и заставлять его самого следить за версиями ПО - не очень хорошая практика. Я лично считаю, что данная проблема целиком и полностью относится к процессу внедрения версии; если существует вероятность непредсказуемых изменений данных и пр., следует заранее согласовывать время и порядок внедрения измнений - хоть сервенрных, хоть клиентских, без разницы. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 12:48 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovКак результат отсутствия своевременного обновления новые "правильные" клиенты могут в своей работе использовать данные введенные "неправильными" и наоборот. Могут. В результате этого может потребоваться выгонять пользователей и синхронно менять. Но далеко не "обязано потребоваться". Alexey KudinovВ данном случае не суть важно, меняются ли правила игры посередине транзакции или посередине одновременной работы различных пользователей с одними данными. Бардак будет и в том и в ином случае. Хм. Я вижу, что Вы действительно не понимаете, о чем я, и тянете в другую сторону. Попробую привести пример. Представьте себе, что есть ХП, которая просто возвращает константу 2000. Есть бизнес-функция, которая дважды вызывает эту ХП, складывает полученные результаты и записывает в таблицу. Вдруг выяснилось, что это ошибка, и на самом деле ХП должна возвращать число 20. Мы меняем ХП, а для корректировки данных выполняем скрипт Код: plaintext 1. 2. 3. 4. Обратите внимание: этот скрипт необязательно запускать тут же; он вполне правильно отработает, если выполнить его позже, скажем ночью. Можно, конечно, выполнить и вместе с накатом процедуры. Проблема этой ситуации в том, что возможен вариант, когда первый вызов ХП вернет значение 2000, второй - значение 20, и в таблицу угодит value = 2020. После этого любой из вышеназванных вариантов покалечит данные; вместо исправленной БД мы получим разрушенную. Возможен и другой вариант: первый вызов вернул 2000, прошел накат процедуры и апдейт данных, второй вызов вернул 20, значение 2020 попало в таблицу и уже корректироваться не будет; опять же, база разрушена. При "клиентском" решении такой проблемы возникнуть не может, ее можно разве что специально создать. Вы вправе сказать, что никто не мешает одной транзакции записать в таблицу 2000, другой - записать 20, а третьей - их сложить. Согласен, бывает и так. Но это вовсе не обязательный вариант, это уже зависит от конкретного случая. А вот опасность предыдущего варианта есть всегда, когда в транзакции более одного вызова ХП. Alexey KudinovЗамечу еще, что растянутость процесса обновления во втором случае способствует бОльшей рассогласованности данных. Зависит от. Вы до сих пор игнорируете мои примеры, но все же еще раз призову взглянуть в отчет по дебиторке; если какие-то активные действия по нему предпринимаются раз в месяц, то затягивание рассогласованности очевидно решительно пофиг - главное, успеть все скорректировать к моменту X, не более того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 12:59 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
aagНу а если, например, правила игры меняются не внутри серверной транзакции, но посреди бизнес-операции? Во-первых, чем ближе эти понятия - тем лучше. Любое расхождение между ними является перманентным источником проблем. Во-вторых, я что-то слегка утомился напоминать, что как только говорится "а если", мы фиксируем "а может быть и иначе", и тут же этот вариант начинает смотреться предпочтительнее, нежели безусловная проблема, существующая при любых условиях. aagЦелостность данных - да, формально нарушена может быть не будет. А вот логически - с точки зрения бизнеса - ошибки могут быть точно такие же. Данные либо целостны, либо нет, либо корректны, либо нет. При втором ответе их надо исправлять, это отдельный сложный процесс. Что такое "целостные данные с логическими ошибками" я не понимаю. aagОтсутствие транзакции просто переводит проблему на другой уровень. Я не понимаю, что за "отсутствие транзакции" и откуда оно взялось. aagА как же авторЛично я не люблю решать административно задачи, легко решающиеся технически Согласуется. Целиком технически эта задача легко не решается. А вот если подкрепить техническими решениями решение управленческое - решается легко. Этот вариант мне и нравится. aagВедь тут вы практически полагаетесь на разумность и аккуратность пользователя, причем в таком случае, когда этого делать никак не следует. У пользователя, как правило, полным-полно своих забот и заставлять его самого следить за версиями ПО - не очень хорошая практика. Хм. У меня такое впечатление, что Вы не прочитали абзац, на который отвечаете. Если, по-Вашему, прыгающий в лицо баннер "Сменилась версия. Обновитесь как только закончите текущую бизнес-операцию" - это "самом следить за версиями", я просто не знаю, что и думать. aagЯ лично считаю, что данная проблема целиком и полностью относится к процессу внедрения версии; если существует вероятность непредсказуемых изменений данных и пр., следует заранее согласовывать время и порядок внедрения измнений - хоть сервенрных, хоть клиентских, без разницы. Это легко, когда внедрение версии идет раз-два в год. А когда патчи накатываются по пять раз в день, подход становится малость неудобным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 13:15 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
2 softwarer Ok, возьмем ваш пример с процедурой, которая возвращает константу. Очевидно, что скрипт, "правящий" данные нужно запускать по крайней мере до тех пор, пока все пользователи не обновятся (ну или один раз после этого). Т.е. каким-либо образом, вам придется отслеживать, что все пользователи обновились. Вам не кажется, что это еще более усложняет ситуацию ? aag совершенно правильно написал aagОтсутствие транзакции просто переводит проблему на другой уровень softwarer, я прекрасно понимаю ваши примеры, я не понимаю вот чего. Почему вы так педалируете идею, что при использовании ХП пользователей надо всегда выгонять для обновления (потому что а вдруг эта ХП используется в транзакции два раза и эта транзакция выполняется в момент обновления), а при неиспользовании ХП их выгонять не обязательно(потому что а вдруг этот запрос нужен раз в месяц). Для двух механизмов получения данных вы используете два разных примера. Почему ? Пожалуйста ответьте на вопрос: есть хранимая процедура, которая возвращает отчет по деб. задолженности. Она не используется в транзакции два и более раз. Нужно ли для ее обновления выгонять пользователей из БД ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 13:35 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerВо-вторых, я что-то слегка утомился напоминать, что как только говорится "а если", мы фиксируем "а может быть и иначе", и тут же этот вариант начинает смотреться предпочтительнее, нежели безусловная проблема, существующая при любых условиях. Да где же эта "безусловная проблема, существующая при любых условиях" ? Вы можете ее сформулировать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 13:40 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey Kudinovвам придется отслеживать, что все пользователи обновились. Вам не кажется, что это еще более усложняет ситуацию ? Нет, мне кажется, это решается автоматически. Раз мы делаем апдейт из базы, мы имеем информацию кто, когда и как обновлялся. Более того, в известных мне случаях ведется лог "кто, когда, откуда, как и какой версией коннектился". Итого, нужен один селект. Фразы aag-а, я к сожалению пока просто не понимаю. Alexey Kudinovа при неиспользовании ХП их выгонять не обязательно(потому что а вдруг этот запрос нужен раз в месяц). Для двух механизмов получения данных вы используете два разных примера. Почему ? Во-первых, про "запрос нужен раз в месяц" - я такого не говорил, я говорил существенно другое. Во-вторых, я не использую два разных примера для двух разных случаев. Изначально я предложил симметричную модель - по две операции рассматривались для каждого из двух вариантов, и показал, что для одной из операций оба варианта одинаковы, для другой - расходятся. Вы на это не возразили, но привели односторонний пример (с ошибкой); я привел пример другого варианта (с дебеторкой) и несимметричное обсуждение пошло именно оттуда. По крайней мере, без заглядывания в историю мне кажется, что беседа развивалась именно так. В-третьих, мне кажется, последний раз я отвечал на этот вопрос в примере с возвратом 2000 и 20, который, по Вашим словам, Вы прекрасно поняли. Боюсь, мне нечего больше сказать, разве что переформулировать и сказать другими словами то же, что и раньше. На всякий случай еще раз: я привел пример, который в "клиентской" реализации, то есть в той же дебеторке, вернет число либо 40, либо 4000, а в ХП-реализации может вернуть 40, 4000 либо 2020. Именно наличие этого третьего варианта усложняет ситуацию в случае ХП. Все. Не знаю что еще и как еще могу сказать. Если не объяснил - значит, так бездарно объясняю. Alexey KudinovПожалуйста ответьте на вопрос: есть хранимая процедура, которая возвращает отчет по деб. задолженности. Она не используется в транзакции два и более раз. Нужно ли для ее обновления выгонять пользователей из БД ? Мне кажется, я ответил на этот вопрос еще на предыдущей странице. Если эта ХП всегда является единственной в транзакции, в этом и только в этом случае ее можно обновлять без обрезания пользователей. Для клиентской организации такого ограничения не требуется; cуществуют ситуации, когда запрос выполняется несколько раз в одной транзакции, и тем не менее патч может быть проведен по ходу обычной работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 14:09 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey Kudinov Да где же эта "безусловная проблема, существующая при любых условиях" ? Вы можете ее сформулировать ? Неоднократно. Проблема 2000/20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 14:12 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Alexey Kudinovвам придется отслеживать, что все пользователи обновились. Вам не кажется, что это еще более усложняет ситуацию ? Нет, мне кажется, это решается автоматически. Раз мы делаем апдейт из базы, мы имеем информацию кто, когда и как обновлялся. Более того, в известных мне случаях ведется лог "кто, когда, откуда, как и какой версией коннектился". Итого, нужен один селект.. Ясно. Так или иначе отслеживать, получать ответ от пользователей и ждать когда все обновятся придется. Т.е. это необходимо, но сделать нетрудно. Хорошо. softwarerМне кажется, я ответил на этот вопрос еще на предыдущей странице. Если эта ХП всегда является единственной в транзакции, в этом и только в этом случае ее можно обновлять без обрезания пользователей. Погодите. Единственной в транзакции или выполняется один раз в транзакции ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 14:17 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Alexey Kudinov Да где же эта "безусловная проблема, существующая при любых условиях" ? Вы можете ее сформулировать ? Неоднократно. Проблема 2000/20. Вы изначально написали softwarerПредставьте себе, что есть ХП, которая просто возвращает константу 2000. Есть бизнес-функция, которая дважды вызывает эту ХП , складывает полученные результаты и записывает в таблицу. Вдруг выяснилось, что это ошибка, и на самом деле ХП должна возвращать число 20. Вы предлагаете считать частный случай многократного вызова одной ХП в транзакции "безусловной проблемой, существующей при любых условиях" ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 14:23 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovВы предлагаете считать частный случай многократного вызова одной ХП Что я предлагаю считать, я написал пару страниц назад; это - простой пример. Имея текст некоего патча, список изменяемых им ХП или нет, в общем случае мы не можем с приемлимыми трудозатратами вычислить, проявится ли указанная проблема или нет. Поэтому нам придется либо очень жестко ограничиться архитектурно (одна транзакция - одна ХП), либо, как я упоминал раньше, просить знатока системы дать зуб, либо наконец надеяться на "авось не бахнет". Либо выгонять пользователей. Первый и третий варианты с моей точки зрения недопустимы, второй - допустим только для небольших решений, которые действительно один человек может досконально знать. Согласен, мне стоило сказать "безусловно, за исключением варианта #2". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 14:31 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerИмея текст некоего патча, список изменяемых им ХП или нет, в общем случае мы не можем с приемлимыми трудозатратами вычислить, проявится ли указанная проблема или нет. Поэтому нам придется либо очень жестко ограничиться архитектурно (одна транзакция - одна ХП), либо, как я упоминал раньше, просить знатока системы дать зуб, либо наконец надеяться на "авось не бахнет". ну вот, уже появился патч + предположение, что те, кто его составляют не знают как используются обновляемые ХП + еще одно предположение что поэтому в архитектуре решат зашить 1 процедура = 1 транзакция. Вам не кажется, что для такого безапиляционного утверждения softwarerЕсли эта ХП всегда является единственной в транзакции, в этом и только в этом случае ее можно обновлять без обрезания пользователей я уж не говорю о softwarer Тогда уж давайте и в минусы процедурного подхода : ради наката тривиального патча приходится выгонять из системы пользователей либо рисковать нарушением целостности БД.слишком много предположений которые в добавок не имеют прямого отношения к собственно процедурному подходу ? OFF: замечу, что идея "одна транзакция - одна ХП" не так глупа как кажется на первый взгляд, но в данном топике это не важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 15:26 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey Kudinovну вот, уже появился патч Патч появился в тот момент, когда я назвал в минусах процедурного подхода накат тривиального патча. С тех пор мы его обсуждаем; эту фразу Вы только что процитировали. Я не очень понял слово "уже" в таком контексте. Alexey Kudinov+ предположение, что те, кто его составляют не знают как используются обновляемые ХП Вы снова очень существенно изменили использованную мной формулировку. Это не предположение, а факт для системы заметных размеров и несупержесткой архитектуры. Еще тридцать лет назад, когда всерьез задумались о тестировании, начали с постулата "невозможно накрыть тестами абсолютно все варианты взаимодействия, все логические цепочки и взаимосвязи". За прошедшее время ситуация скорее ухудшилась. Alexey Kudinov+ еще одно предположение что поэтому в архитектуре решат зашить 1 процедура = 1 транзакция. И снова Вы вроде как пересказываете мои слова, а получается нечто совершенно другое. По Вашим словам, это неизбежное следствие предыдущего пункта. Я же сказал, что это единственная альтернатива выгонянию пользователей. Я не понимаю, как можно не видеть разницы между этими фразами. Alexey KudinovВам не кажется, что для такого безапиляционного утверждения Не придавайте слишком большого значения, но "апелляция". Alexey Kudinovслишком много предположений Пока не увидел ни одного, действительно высказанного мной. Alexey Kudinovкоторые в добавок не имеют прямого отношения к собственно процедурному подходу ? На тему связи моего утверждения с процедурным подходом я исписал уже около двух страниц форума. Поскольку предположений пока не обнаружено, о их связи с процедурным подходом говорить не готов, да и незачем собственно. Alexey KudinovOFF: замечу, что идея "одна транзакция - одна ХП" не так глупа как кажется на первый взгляд, но в данном топике это не важно. Ее глупость или не глупость действительно не важна. Это архитектура с исключительно жесткими ограничениями, соответственно применимая только в относительно редких особых случаях. Поэтому я упомянул ее как исключение и далее в основном говорил об "общем случае за этим исключением". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 15:59 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Это не предположение, а факт для системы заметных размеров и несупержесткой архитектуры. Я не могу с этим согласится. Вы говорите что то, что присылающий обновление ХП не знает где она используется - это факт. Я же считаю, что это предположение. Собственно, если это считать это фактом, то ваш вариант с постепенным обновлением с последующей коррекцией результатов одновременной работы старой и новой версий выглядит тем более странно. Потому что "невозможно накрыть тестами абсолютно все варианты взаимодействия, все логические цепочки и взаимосвязи" Замечу, что я считаю что выяснить где используется ХП программисту не составляет такого уж большого труда. Ладно, думаю пора заканчивать. Мне надоело, да и вам судя по всему тоже. Я по прежнему считаю, что обновлять ХП "на лету" можно, но лучше этого не делать. А вот постепенно клиентов обновлять не стоит, хотя тоже можно. Судя по всему принципиальная разница в наших с вами взглядах в вероятностных оценках и степени риска порчи данных в первом и втором варианте. Видимо, в нашей профессиональной деятельности у нас был несколько различный опыт в этом плане. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 16:57 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovВы говорите что то, что присылающий обновление ХП не знает где она используется Это утверждение ложно. Мне сейчас очень хочется спать, но тем не менее я крайне удивлюсь, если Вы найдете в моих фразах такую цитату. Мало того, Вы ухитрились значимо изменить смысл этой формулировки даже по сравнению с Вашим же предыдущим, уже исковерканным вариантом. Признаться, я просто не понимаю, что происходит; как можно беседовать на серьезную тему при столь... гибких формулировках? Alexey KudinovСудя по всему принципиальная разница в наших с вами взглядах в вероятностных оценках и степени риска порчи данных в первом и втором варианте. К сожалению, Вы так и не обратили внимание, что я не говорю о вероятностных оценках и избегаю их там, где речь идет о сохранности данных. Я говорю о простой дискретной системе: "есть гарантия сохранности" / "нет гарантии сохранности". И в зависимости от этого ответа допускаю либо не допускаю обновление по живому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 17:10 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Alexey KudinovВы говорите что то, что присылающий обновление ХП не знает где она используетсяЭто утверждение ложно. Мне сейчас очень хочется спать, но тем не менее я крайне удивлюсь, если Вы найдете в моих фразах такую цитату. Удивляйтесь: softwarer Alexey Kudinov + предположение, что те, кто его составляют не знают как используются обновляемые ХП Это не предположение, а факт для системы заметных размеров и несупержесткой архитектуры Или вы опять скажете, что я не так трактовал ваши слова ? softwarerПризнаться, я просто не понимаю, что происходит; как можно беседовать на серьезную тему при столь... гибких формулировках? Я тоже не понимаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 17:25 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovУдивляйтесь: Тому, что Вы заботливо вырезали стоящую перед этим фразу "Вы снова очень существенно изменили использованную мной формулировку"? Я просил Вас показать мои слова, а не Ваши собственные. Alexey KudinovИли вы опять скажете, что я не так трактовал ваши слова ? Скажу, что помимо прочего, даже два процитированных Вами Ваших же утверждения различны по смыслу, на что я готов вторично обратить Ваше внимание. Если, конечно, Вы не считаете слова "где" и "как" синонимами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 17:31 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarer Я просил Вас показать мои слова, а не Ваши собственные. Это уже смешно. Я написал автор+ предположение, что те, кто его составляют не знают как используются обновляемые ХП вы ответили (привожу полностью, раз уж вы так хотите): softwarer Вы снова очень существенно изменили использованную мной формулировку. Это не предположение, а факт для системы заметных размеров и несупержесткой архитектуры Я не знаю как иначе из этих двух цитат трактовать вашу мысль, кроме "для системы заметных размеров и несупержесткой архитектуры те, кто его [патч] составляют не знают как используются обновляемые ХП " softwarer Если, конечно, Вы не считаете слова "где" и "как" синонимами в данном контексте это безусловно синонимы. Зная "где" используется ХП я знаю "как" она используется. softwarer, я все пытаюсь получить внятное обьяснение вашей фразе softwarer Если эта ХП всегда является единственной в транзакции, в этом и только в этом случае ее можно обновлять без обрезания пользователей Вы увели разговор в сторону того, кто что и как сказал и что он на самом деле имел ввиду. Что является синонимами, а что нет. Я уверенно полагаю, что смысла продолжать больше нет, начались придирки к формулировкам, отдельным фразам и словам. Если кто-то еще читает этот флейм, выводы он сделает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 17:51 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
softwarerПредставьте себе, что есть ХП, которая просто возвращает константу 2000. Есть бизнес-функция, которая дважды вызывает эту ХП, складывает полученные результаты и записывает в таблицу. Вдруг выяснилось, что это ошибка, и на самом деле ХП должна возвращать число 20. Мы меняем ХП, а для корректировки данных выполняем скрипт Хороший пример. Заметьте, здесь нет ни слова про транзакции. Да, если мы будем складывать батчем, вызываемым с клиента, 2020 мы не получим. Зато получим в каких-то записях 2000, а в каких-то - 20. Чуть приблизим этот пример к реальности - пусть ХП или батч возвращают не константу, а выражение аргументом в котором является вводимое пользователем число. Например, умножают на два. И как теперь, не зная исходных цифирок, исправляющим скриптом отделить правильные от неправильных? Когда я говорю про "целостные данные с логическими ошибками" это именно и означает - данные, подлежащие исправлению. Путем накатывания скрипта или вручную. И неважно, что потенциально проблемы при использовании ХП могут здесь быть более серьезны. Тем более, что время прописывания (а значит вероятность попадания) одной ХП меньше времени выкладывания одного клиентского модуля. Важно, что они могут быть в любом случае, если ПО меняется посреди совершения бизнес-операций. авторЭто легко, когда внедрение версии идет раз-два в год. А когда патчи накатываются по пять раз в день, подход становится малость неудобным. Когда патчи накатываются по пять раз в день, пользователи забивают на баннеры. Привыкают. Еще раз. Мое мнение. Если патч (ХП, клиент - не важно) - содержит изменение критичных операций - он должен накатывать только после согласования со всеми пользователями. Или в нерабочее время. Иначе - в любом случае велика вероятность что понадобятся исправляющие скрипты. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 20:38 |
|
||
|
Изменение таблиц через ХР, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Что есть бизнесоперация? :) Думаю, любые изменения в рамках бизнесоперации должны быть транзакционны. Т.е. все согласованные изменения данных в рамках операции - это одна транзакция. Растянутые бизнесоперации - это скорее всего некая последовательность маленьких бизнесопераций. Вопрос согласованости данных в таком случае - это совсем отдельный вопрос, практически не связанный с транзакционностью сервера БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2006, 09:07 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1544980]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
144ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
125ms |
get tp. blocked users: |
2ms |
| others: | 230ms |
| total: | 539ms |

| 0 / 0 |
