2013-04-19 9 views
2

죄송합니다. 이것은 바보 같은 질문입니다. 나는 잠시 게임에서 빠져 나왔다.데이터베이스 논리 VS 응용 프로그램 논리

웹 응용 프로그램에 PostgresSQL을 사용할지 여부를 결정합니다. 나는 전에 그것을 사용한 적이 없다. 내 연구를 해본 결과, 저장 함수에 대한 PGSQL 언어가 정말 마음에 든다.

종종 웹 앱 코드에서 레코드를 저장하고 있습니다. 이것은 레코드가 이미 존재하는지 확인하는 것으로 구성됩니다. 업데이트하는 경우 새 레코드를 INSERT하십시오. PGSQL와

- 나는 이점이에

을 자신의가 (당신이 할 수없는 확신 메신저 반대 MySQL을로) 한 쿼리에서이 모든 것을 할 수 있습니까? 또는이 로직이 데이터베이스의 저장 함수가 아닌 web-app 계층에 남아 있어야합니다.

거친 예가 PGSQL에 있습니다. 그것의 유일한 설명과 안전하거나 좋은 코드를 의미하지 않습니다.

CREATE OR REPLACE FUNCTION save_client(IN strforename character varying, IN strnew character varying) 
    RETURNS TABLE(forename character varying, surname character varying) AS 
$BODY$ 

    DECLARE myrec int; 

    BEGIN 

     SELECT idx_clients INTO myrec from "Clients" WHERE LOWER("Clients".forename)=$1; 


     IF NOT FOUND THEN 
      RAISE NOTICE 'No results found.%',myrec; 

      INSERT INTO "Clients" (forename,surname) VALUES (strnew,strforename); 
     ELSE 
      RAISE NOTICE 'YES results found.%',myrec; 

      IF myrec NOTNULL THEN 
       UPDATE "Clients" SET forename=$2 WHERE idx_clients=myrec; 
      END IF; 

     END IF; 

    END; 

$BODY$ 
나는 보통이 아니라 몇 가지 이유를 들어, 응용 프로그램에서 이러한 종류의 기능이있을 것이다

답변

0

: 보통,

  1. 서버로드 데이터베이스 서버가 자주 어쨌든로드가 될 것입니다 응용 프로그램 서버를 덜 그렇게.
  2. 기술 구현 데이터베이스를 불가지론 적으로 남겨두기 때문에 나중에 MySQL 또는 Oracle로 이동하기로 결정하면 기능을 잃지 않거나 다시 설계해야합니다.
  3. 유지 관리 가능성 코드를 데이터베이스에 추상화하면 다른 사람이 자신과 별도로 유지 관리해야하는 경우 직관력이 떨어집니다. 그들은 거기에없는 기능을 찾기 위해 시간을 할애 할 것입니다.

주요 고려 사항은 내 것과 다를 수 있습니다. 데이터베이스에서 모든 작업을 수행하면 성능이 약간 향상 될 수 있기를 기대하지만 가능한 한 기술에 독립적 인 구현 방식을 유지하려고 노력합니다.

+0

죄송합니다. @Folarfury가 자세히 설명해 주실 수 있습니까? 당신은 오히려 이런 종류의 기능을 가지고 있다고 말하지만, 당신이 어떤 것을 언급하는지는 불확실합니다. – user2007960

+0

일반적으로 비즈니스 논리입니다. 존재하지 않는 키 (그렇지 않으면 업데이트되지 않는 한)를 유지하거나 읽는 응용 프로그램의 코드 조각을 삽입하는 것이 직관적이지는 않습니다. 나는 그 종류의 논리가 데이터베이스가 아닌 응용 프로그램 코드에있을 것으로 기대합니다. –

+0

Soloarfury에 감사드립니다 -이 질문을 게시 할 때까지 그 방법을 설명했습니다. 그게 일반적인 합의인지 궁금해? – user2007960

3

나는 몇 가지 이유에 대한 데이터베이스에 넣고 선호 : 그것은 당신이 API 뒤에 데이터베이스를 캡슐화 할 수 있습니다

  1. . 응용 프로그램이 런타임에 호출 구문을 발견 할 수 있도록 API를 검색 가능하게 만들 수도 있습니다 (하나의 접근 방법에 대해서는 http://ledgersmbdev.blogspot.com의 게시물 수를 참조하십시오). 다시 캡슐화하면 rdbms가 잘 정의 된 API를 사용하여 서버가되어 결국 여러 응용 프로그램이 동일한 db에 안전하게 액세스 할 수 있습니다.

  2. 본질적으로보다 안정적인 인터페이스를 만드는 데 사용할 수있는 일종의 종속성 반전을 보장합니다.

  3. 대부분의 경우 응용 프로그램 파일에서 SQL을 유지할 수 있습니다 (호출 인터페이스 자체는 단일 API로 추상화 될 수 있기 때문에).

  4. 트랜잭션 로직과 성능을 통해

    더 나은 제어 (그러나 아래 참조)

이 존재가주의해야 할 몇 가지 함정이 있습니다 말했다 :

  1. 저장 발동이 곳 대부분의 유지 관리가가 이들은 사소한 지원 논리가있는 단일 대형 쿼리입니다.

  2. 는 트랜잭션 및 비 트랜잭션 로직을 혼합하지 마십시오 잠금

  3. 조심하십시오. 트랜잭션 로직은 db에 속합니다. 트랜잭션이 아닌 것은 트랜잭션 외부에 속합니다. 예를 들어 저장 프로 시저에서 전자 메일을 보내지 마십시오. 데이터베이스 트랜잭션을 일시 중지하여 사용자에게 네트워크 연결을 시도하여 계속할지 묻습니다. 저장 프로 시저 내에서 직접 실제 영향을 미치는 스크립트에 이들을 연결하지 마십시오 .....

  4. 계약에주의하십시오. 사람들이 저장 프로 시저 개발에서 실행하는 가장 큰 문제 중 하나는 스키마 변경과 관련이 있습니다. 수집해야하는 추가 열을 추가하고 코드가 변경되는 두 위치 대신 적어도 세 개가 있어야합니다. 이것이 검색 가능성에 중점을 둔 한 가지 이유입니다. 이렇게하면보다 유연한 계약을 맺고 변경해야하는 곳에서만 코드를 변경할 수 있기 때문입니다. 즉, 일이 순조롭게 실패 할 수 있습니다.

나는 대부분의 SQL 및 PL/pgSQL의 수십 PostgreSQL의 저장 프로 시저의 라인의 수천의 저자로이 대부분을 말한다. 스토어드 프로 시저에는 관리상의 어려움이 있습니다. 그러나 일단 길들이면 길들이는 가치가 있습니다.

+0

이것은 흥미로운 관점이며 아래에서 내 자신의 의견을 다시 생각하게합니다. –

+0

@Oshawott 귀하의 지위를 뒷받침하기 위해 여러 데이터베이스의 애플리케이션과 여러 애플리케이션의 데이터베이스간에 주요한 절충점이 있다고 생각합니다. 응용 프로그램을 판매하려고하고 MS SQL, Oracle 및 MySQL에서 실행하려고하지만 db에 대한 모든 액세스가 응용 프로그램을 통한다고 말하고 싶다면 저장 프로 시저가 가장 확실하게 피해야 할 항목입니다. –

+0

저는 지원 데이터베이스가있는 대형 응용 프로그램의 관점에서이 경향이 있습니다. 개인적인 경험으로는 MySQL에서 pgSQL, memSQL, 오라클로 옮겼지만 핵심 언어에서 전환 한 적이 없기 때문에 일회적으로 이식 가능한 데이터베이스가 중요하다고 생각합니다. –

관련 문제