Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Религиозные войны > Бизнес логика в хранимых процедурах vs.


Автор: Vex 18.11.2009, 13:36
итак, какой подход лучше?

Автор: gcc 19.11.2009, 10:26

на python и perl можно писать прямо в процедуре в PgSQL

я выбрал п.2

ЗЫ еще есть ORM и абстрации разные для ЯП

Автор: unicuum 19.11.2009, 12:50
fuck my brain smile какие вы тут все умные
Цитата
Бизнес-логика — в разработке информационных систем — совокупность правил, принципов, зависимостей поведения объектов предметной области системы. Иначе можно сказать, что Бизнес-логика — это реализация правил и ограничений автоматизируемых операций. Является синонимом термина «Логика предметной области» (Domain Logic).


Добавлено через 9 минут и 21 секунду
В общем, если возник такой вопрос, значит база держит хранимые процедуры. Ещё было бы хорошо, чтобы она триггеры держала и далее по списку. Если база клиент-серверная, типа постгреса и т.д, то лучше на неё спихивать обязанности, так как это обеспечит максимальное быстродействие за счёт оптимизации двига, который самим хpен сделаешь классами и минимальный объём данных между вашим клиентом и сервером базы. С другой стороны то что можно обработать клиентом в классах программы, им и должно быть обработано. Идея же проста, спихнуть обязанности какие только можно на базу, а какие выгоднее классами, делать ими.

Автор: Bulat 19.11.2009, 13:10
Есть такое мнение - что транзакция используемая в коде программы должна быть ровно такая(по времени, по количеству вмещаемого в себя кода и т.п.),  какая требуется бизнес-логикой. smile

Т.е. тут нет однозначного ответа. Разве что я отдаю предпочтение классам. smile

Автор: unicuum 19.11.2009, 13:39
Цитата(Bulat @  19.11.2009,  13:10 Найти цитируемый пост)
Т.е. тут нет однозначного ответа. Разве что я отдаю предпочтение классам. 

Вообще-то в некоторых книгах по базам данных дают однозначный ответ, в каком случае использовать то или другое. Все правила уже придумали и разложили по "полочкам". Другое дело, что Vex не описал детально, что он хочет делать, потому пока не к чему их применять. У размытой цели, размытое решение.

Автор: gcc 19.11.2009, 22:22
в одном проекте процедуры были и в PL/pgSQL и в PL/Perl (там свои классы можно вызывать)

но некоторые в PL/pgSQL были наверное для быстродействия 

без процедур было бы сложно наверное, в одних процедуре/триггере запросов было где-то 30-70 (я их не писал, они уже были написаные)

вот можно свои классы вызывать  smile 

Код


CREATE FUNCTION ca (bigint, character varying, character varying, character varying, bigint) RETURNS character varying
    AS $_X$

use strict;
use POSIX;
use Sys::Hostname;
use MIME::Lite;
use MIME::QuotedPrint;

my ($user,$from,$to,$subj,$tmpl)=@_;

my $key=join'',map $$_[rand@$_],([0..9,'a'..'f'])x32;

my $url="http://www..ru/с/$key/";

my $date = POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime);
my $hostname = hostname;

my $parts=spi_exec_query(<<SQL);
    select  template, subject, type
      from  email_templates
     where  id = $tmpl
SQL

my $_tmpl = $parts->{rows}[0]{template};
my $_subj = $parts->{rows}[0]{subject};

for($_tmpl,$_subj){
    s/__FROM__/$from/g;
    s/__TO__/$to/g;
    s/__KEY__/$key/g;
    s/__SUBJ__/$subj/g;
    s/__SUBJ~(\d+)__/substr($subj,0,$1)/ge;
    s/__DATE__/$date/g;
    s/__HOSTNAME__/$hostname/g;
    s/__URL__/$url/g;
}

utf8::encode $_ for $_tmpl,$_subj;

for($to){my$x;
  /</ ? s/<.*?\@/<mail.robot\@/
      : s/^.*?\@/mail.robot\@/;
  s/^(.*?)</utf8::encode $x=$1;'=?utf-8?Q?'.encode_qp($x,'').'?= <'/e;
}
my $mail = MIME::Lite->new(
    From     => $to,
    To       => $from,
    Subject  => '=?utf-8?Q?'.encode_qp($_subj,'').'?=',
    Encoding => 'base64',
    Type     => 'text/plain; charset=utf-8',
    Data     => $_tmpl,
);

$mail->send;

return $key;
$_X$
    LANGUAGE plperlu;




Цитата

pyPgSQL is a package of two modules that provide a Python DB-API 2.0 compliant interface to PostgreSQL databases. The first module, libpq, exports the PostgreSQL C API to Python. This module is written in C and can be compiled into Python or can be dynamically loaded on demand. The second module, PgSQL, provides the DB-API 2.0 compliant interface and support for various PostgreSQL data types, such as INT8, NUMERIC, MONEY, BOOL, ARRAYS, etc. This module is written in Python.

Автор: Bulat 20.11.2009, 13:06
Цитата(unicuum @  19.11.2009,  13:39 Найти цитируемый пост)
Вообще-то в некоторых книгах по базам данных дают однозначный ответ, в каком случае использовать то или другое. Все правила уже придумали и разложили по "полочкам".


Не согласен. Я бы даже сказал большее, есть такие проекты, которые называются "динамические", яркий пример. Это тот случай, когда нельзя однозначно сказать какой "случай"  smile Сегодня так, а завтра глядишь придется лезть и в самое сердце, и дорабатывать. Поэтому, если я умею использовать, действительно умею - некий инструмент, я лучше буду придерживаться его, так как я всегда смогу его малость доработать... А вот объять необъятное - нельзя, т.е. нельзя владеть всеми знаниями на все случаи. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)