powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вопрос по проектированию
25 сообщений из 29, страница 1 из 2
Вопрос по проектированию
    #33607261
Giker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сказано: "Бизнеслогика приложения должна быть реализована на сервере", то я должен в приложении только выполнять хранимые процедуры реализованные на сервере и анализировать эксепшены которые выдает мне сервер, как результат их выполнения, и уже по этим эксепшенам выдовать пользователю отчет о работе с БД, и не имею права в приложении проверять что, например, поле обязательное к заполнению заполнено не было, или имею права?
НО если я имею права, тогда бизнес логика организуеться в приложении а не на сервере.
Запутался обьясните как правильнее.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607311
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще то проверка данных перед записью и бизнес логика - это не синонимы.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607352
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GikerЕсли сказано: "Бизнеслогика приложения должна быть реализована на сервере", то я должен в приложении только выполнять хранимые процедуры реализованные на сервере и анализировать эксепшены которые выдает мне сервер, как результат их выполнения, и уже по этим эксепшенам выдовать пользователю отчет о работе с БД, и не имею права в приложении проверять что, например, поле обязательное к заполнению заполнено не было, или имею права?
НО если я имею права, тогда бизнес логика организуеться в приложении а не на сервере.
Запутался обьясните как правильнее.
Поле, обязательное к заполнению, в структуре таблицы БД определяется с условием "NOT NULL"; правильность вставки/удаления/модификации контролируется триггерами автоматически (триггеры хранятся на сервере).

Заполнение данных в таблице также производится в хранимых процедурах, которые на клиенте только вызываются; данные передаются в процедуру в качестве параметров...
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607419
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STFF1
STFF2
STFF3
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607473
_hike_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из "Бизнеслогика приложения должна быть реализована на сервере"
совсем не обязательно следует что
она должна быть реализована в БД.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607558
проц
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Giker"Бизнеслогика приложения должна быть реализована на сервере",
Вся Бизнеслогика не может быть реализована на ХП, какая-то часть все равно останется в приложениях. другое дело что само приложение может выполняться на
сервере БД
сервере приложений
клиенте
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607646
Giker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим что есть две ситуации:
1. Из таблицы удаляються данные являющиеся родительским ключом к данным в другой таблице. Понятно что сервер выдаст ошибку, которую нужно обработать на клиенте, и выдать пользователю сообщение об ошибке.
2. Если происходит добавление в БД и есть поле NOT NULL, то есть несколько вариантов:
А. Проверяем на клиенте что бы данные были введены
Б. Проверяем На сервере по условию NOT NULL И если данных нет сервер выдаст ошибку, которую нужно обработать на клиенте, и выдать пользователю сообщение об ошибке.
В. А и Б
Как правильней?
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607714
_hike_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО 2А
Т.к. требует минимального программирования на клиенте но хорошо разгружает и сеть и сервер.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33607778
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_hike_ИМХО 2А
Т.к. требует минимального программирования на клиенте но хорошо разгружает и сеть и сервер.
И просаживает сервер, если с ним работает не твой клиент.

авторКак правильней?
2В ИМХО
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608121
_hike_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серега
а я не говорил что нужно констрейнты или еще какие проверки на сервере отключать ...
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608170
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_hike_а я не говорил что нужно констрейнты или еще какие проверки на сервере отключать ...
Ну дак тогда у тебя должно быть 2В, а ты указал 2А, вот я и решил. Сори.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608213
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gikerи не имею права в приложении проверять что, например, поле обязательное к заполнению заполнено не было, или имею права?
Любую здравую мысль можно довести до абсурда, и процитированное - пример его.

Подход с переносом всех проверок в СУБД в принципе имеет право на жизнь, но это пожалуй все хорошее, что о нем можно сказать. Можно утверждать, что при такой реализации невозможно сделать хорошего клиента, максимум "приемлимого". Почему: потому что логика проверки и обработки ошибок ввода существенно зависит от клиента. Например, представьте себе, что данные вводятся с помощью wizard-а - в этом случае верифицировать надо каждую очередную страницу поотдельности, в то время как вызывать ХП следовало бы по финальному OK. То есть оказывается, что серверная логика должна знать о деталях реализации клиента и учитывать их в своей реализации - это нонсенс, извращение.

Мой подход таков: большинство проверок, являясь тривиальными, должны быть реализованы и на сервере, и на клиенте. Клиент при этом обеспечивает максимально удобный интерфейс пользователя, невозможный при проверках на сервере, а серверные проверки защищают в основном от ошибок программиста - то есть ошибок в ХП и в клиенте. Сложные проверки, для реализации которых требуются изрядные усилия, делаются только на сервере.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608315
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеете право и должны проверять - не все, но многое. Основная проблема - меняющаяся логика проверок. Ну так настройку проверяемой формы нужно также хранить на сервере.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608432
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от ситуации. Разумеется, если условия на клиенте можно скопировать с constraint-ов - нужно так делать. Но например, довольно стандартная ситуация - набор обязательных полей зависит от статуса документа. На сервере эти наборы проверяются в соответствующих ХП "изменить статус с А на Б" - а в клиенте может быть удобнее просто реализовать независимо.

Да, разумеется возможно реализовать некий конфигурируемый движок проверок, имеющий серверную и клиентскую части, опирающиеся на общую метаинформацию. Но.. у меня не было проектов, где это оказалось бы оптимальным решением [с моей точки зрения].
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608463
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Giker......Как правильней?

правильней - в зависимости от чего ? То бишь не ясны критерии. По мне - надёжность и скорость...посему...
1) проверка на клиенте (позволяет оперативно, без обращения к серваку запросить все необходимые данные у клиента, либо из ОЗУ станции и не нагружать сетку)..
2) проверка на серваке...(повышает надёжность операции в целом, самих данных, атомарность и т.д..)

сразу замечу - где проходит граница атомарности операции, это не всегда очевидно..требует опыта как мне икается...лакмуссавая бамажка в этом деле - чем просче код, тем правильней...Как нистранно правильно организованный сервак приложения (к примеру) - ведёт именно к УМЕНЬШЕНИЮ кода как на клиенте, так и на сервере...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608687
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Как нистранно правильно организованный сервак приложения (к примеру) - ведёт именно к УМЕНЬШЕНИЮ кода как на клиенте, так и на сервере...
... и к ВОЗРАСТАНИЮ кода на сервере приложений ;)
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608702
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Estets... и к ВОЗРАСТАНИЮ кода на сервере приложений ;)

увы, лично мой опыт показывает именно уменьшение(!) кода как на клиенте, так и на сервере...
только не спрашивайте меня - почему...я если честно - сам до конца не нашёл ответов...но факт на лицо (лично для меня) - если код упрощаеться, в отличие от "плоской модели" - значит сечение клиент-сервер удачное....


с уважением
(круглый)
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608735
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЗависит от ситуации. Разумеется, если условия на клиенте можно скопировать с constraint-ов - нужно так делать. Но например, довольно стандартная ситуация - набор обязательных полей зависит от статуса документа. На сервере эти наборы проверяются в соответствующих ХП "изменить статус с А на Б" - а в клиенте может быть удобнее просто реализовать независимо.

Да, разумеется возможно реализовать некий конфигурируемый движок проверок, имеющий серверную и клиентскую части, опирающиеся на общую метаинформацию. Но.. у меня не было проектов, где это оказалось бы оптимальным решением [с моей точки зрения].
Мы пошли другим путем метаинформация о том что в данном документе, в данном состоянии такие-то поля являются редактируемыми, а такие-то доступными, хранится на сервере а проверяется на приложении. Бизнес-проверки вынесены в процедуры. А вот constraint-ов и триггеров в базе практически нет. Только в учетном блоке где проводки, чтоб ни при каких условиях не развалить баланс.

Считаю данный подход для себя оптимальным.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608755
123423
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бред какой то…

На клиенте в идеале не должно быть кода вообще!
Но люди уроды поэтому на клиенте сидит код который отлавливает ошибки ввода или осуществляет подсказки пользователю или оказывает помощь в настройки перед запросом к серверу… всё это исключительно интерфейс…

Простой пример код который запрещает ввод не цифр в поле для цифр :)

Проверка подлинности клиента правильности его желаний и из выполнения все должно быть на сервере… и не обязательно в процедурах… это как у кого тиль кодинга…
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33608872
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это да. Без людей то оно б куды как проще было бы.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33609345
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EstetsМы пошли другим путем метаинформация о том что в данном документе, в данном состоянии такие-то поля являются редактируемыми, а такие-то доступными, хранится на сервере а проверяется на приложении.
Тут всплывает та же проблема, которую Вы описывали чуть ранее - а что если задача малость нестандартна и надо делать новую настройку. Что, если поле должно обрабатываться нестандартным компонентом-редактором. Итп.

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

Впрочем, в любом случае здесь надо смотреть по месту, универсально лучших решений не существует.

EstetsБизнес-проверки вынесены в процедуры.
Что есть бизнес-проверки?

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

EstetsА вот constraint-ов и триггеров в базе практически нет. Только в учетном блоке где проводки, чтоб ни при каких условиях не развалить баланс.
Хм. Звучит так, словно остальную базу можно разваливать :)

EstetsСчитаю данный подход для себя оптимальным.
Безусловно, надо смотреть по ситуации. Но я крайне трепетно отношусь к качеству данных в БД, поэтому в конкретной ситуации вряд ли согласился бы.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33611298
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer EstetsМы пошли другим путем метаинформация о том что в данном документе, в данном состоянии такие-то поля являются редактируемыми, а такие-то доступными, хранится на сервере а проверяется на приложении.
Тут всплывает та же проблема, которую Вы описывали чуть ранее - а что если задача малость нестандартна и надо делать новую настройку. Что, если поле должно обрабатываться нестандартным компонентом-редактором. Итп.

Нестандартная задача тебует нестандартного решения ;) Мы пошли по пути стандартизации, т.е. пока поле не описано в настройке документа(метаинформация) оно в базе не сушествует. Правда до того что дошла Axapta, что поле удаляется физически если его удалить из насторйки мы не дошли.
softwarer
Другой аспект, возможно, связан с технологией - в дельфе часто удобно сделать компонент, хранящий такие настройки и берущий на себя их выполнение. Это куда удобнее, нежели в какой-то программе заполнять конфигурационную таблицу на сервере. Конечно, можно научить этот компонент держать свои настройки в БД, но минусов у этого скорее больше чем плюсов.

У нас 90% автогенеримых процедут по поддержке общения с базой. Так что в данном контексте это удобнее.

softwarer
EstetsБизнес-проверки вынесены в процедуры.
Что есть бизнес-проверки?

Если проверки уровня "дата начала должна быть меньше даты конца" - повторюсь; я не думаю, что таким образом можно сделать хороший интерфейс с разумными трудозатратами. См. пример с визардом.
Не совсем согласен, приведу другой пример. Пока документ находится в состоянии "редактируется", большинство его полей может быть не заполнено. Оператор может множество раз открывать его, исправлять, дозаполнять. Все бизнес-проверки начиная от "дата начала должна быть меньше даты конца" до может ли клиент уйти в минус при расчете комиссий, и разрешена ли ему короткая позиция при продаже ЦБ ;) вычисляется в момент перехода документа из состояния "редактируется" в состояние "исполнено".

softwarer EstetsА вот constraint-ов и триггеров в базе практически нет. Только в учетном блоке где проводки, чтоб ни при каких условиях не развалить баланс.
Хм. Звучит так, словно остальную базу можно разваливать :)

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

softwarerБезусловно, надо смотреть по ситуации. Но я крайне трепетно отношусь к качеству данных в БД, поэтому в конкретной ситуации вряд ли согласился бы.
Часто приходилось сталкиваться, особенно при внедрении продуктов, что информация которую можно было вытащить из старых систем была неполная, и приходилось с этим мириться. Соответственно несколько полей обязательных к заполнению в новой системе в старой отсутствовали.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33611322
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123423
На клиенте в идеале не должно быть кода вообще!
Но люди уроды поэтому на клиенте сидит код который отлавливает ошибки ввода или осуществляет подсказки пользователю или оказывает помощь в настройки перед запросом к серверу… всё это исключительно интерфейс…

Согласен, все что можно проверить на клиенте, не обращаясь к серверу, желательно проверять на клиенте. Если требуется получать данные с сервера, по справочникам, лимитам, остаткам. То желательно это на сервере и проверять.

Единственное исключение из данного правила у нас, как я упоминал выше, получение с сервера, при открытии редактора данных о редактируемости-обязательности полей. И то это связано с тем что эта информация может динамически меняться для данного экземплята документа, в зависимости от его текущего состояния.
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33612046
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EstetsНестандартная задача тебует нестандартного решения ;)
Мы пошли по пути стандартизации,
Не возражаю, можно так идти. Соотношение цены и результата здесь имхо зависит от конкретных условий, "вообще" трудно что-то сказать.

EstetsУ нас 90% автогенеримых процедут по поддержке общения с базой. Так что в данном контексте это удобнее.
1. Я не понимаю, как этот Ваш ответ связан со сказанным мной. Я сказал: "да, можно научить". Вы говорите: "у нас научили". Я говорю: "но по сравнению с нормальным для дельфы решением это будет менее удобно". Вы говорите: "так что удобнее".

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

Estets softwarer..... См. пример с визардом.
Не совсем согласен, приведу другой пример.
Хм. Если мы говорим об универсальной технологии, примеры, когда она работает хорошо никак не перекрывают примеров, когда она работает плохо. Она обязана либо [практически всегда] работать хорошо, либо же не будет универсальной.

EstetsПока документ находится в состоянии "редактируется", большинство его полей может быть не заполнено. Оператор может множество раз открывать его, исправлять, дозаполнять. Все бизнес-проверки начиная от "дата начала должна быть меньше даты конца" до может ли клиент уйти в минус при расчете комиссий, и разрешена ли ему короткая позиция при продаже ЦБ ;) вычисляется в момент перехода документа из состояния "редактируется" в состояние "исполнено".
И? Не очень понял, что показывает этот пример. Да, так можно делать. При этом никто не мешает сделать проверку грамотно: еще в состоянии "редактируется", если заполнены обе даты и дата начала больше - ругаться. Потому как одно дело "еще не заполнено", другое - "уже заполнено криво".

Какая разница между этими вариантами.... мне вспоминаются старые компиляторы. Когда-то работа с диалоговыми комплексами шла примерно так: написал код, запускаешь компилятор, он показывает ошибку. Запускаешь редактор, исправляешь ее, выходишь из редактора, запускаешь компилятор, он показывает следующую ошибку. Было очень неудобно. Были хорошие компиляторы - которые показывали разом несколько ошибок, если могли продолжить компиляцию, пропустив ошибочный кусок. Это здорово ускоряло процесс. А сейчас компилятор показывает некоторые ошибки прямо в ходе набора текста - и оно еще удобнее.

Estets softwarerХм. Звучит так, словно остальную базу можно разваливать :)

Ну чисто теоретически да
Тогда это пожалуй не очень интересный случай. Сродни "печатаю слепым методом. 850 знаков в минуту..."

EstetsЧасто приходилось сталкиваться, особенно при внедрении продуктов, что информация которую можно было вытащить из старых систем была неполная, и приходилось с этим мириться. Соответственно несколько полей обязательных к заполнению в новой системе в старой отсутствовали.
Это вовсе не обязано мешать проверкам целостности на сервере. Простой вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> create table olddata as select rownum i from dual connect by level <=  100  ;

Table created

SQL> create table newdata as select i, cast ( null as integer ) j from olddata ;

Table created

SQL> alter table newdata modify j constraint newdata_j not null novalidate ;

Table altered

SQL> insert into newdata select rownum i, rownum j from dual connect by level <=  100  ;

 100  rows inserted

SQL> select * from newdata where i =  1  ;

         I          J
---------- ----------
          1  
          1            1 

SQL> insert into newdata ( i ) values (  101  ) ;

insert into newdata ( i ) values (  101  )

ORA- 01400 : cannot insert NULL into ("TEST"."NEWDATA"."J")

В более сложном, когда подобная функциональность отсутствует - никто не мешает сделать в таблице флажок "старых данных" и создавать таблицу примерно так:

Код: plaintext
1.
2.
3.
4.
5.
create table newdata ( 
  .....
  is_old char( 1 ),
  constraint check_field_not_null ( is_old = 'Y' or field is not null )
  .....
...
Рейтинг: 0 / 0
Вопрос по проектированию
    #33612346
iAndrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа что Вы думаете об этом?
http://www.firststeps.ru/mfc/mcp/70-016/r.php?49
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вопрос по проектированию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]