태그 보관물: design-patterns

design-patterns

“코드에서 SQL 서버를 효과적으로 활용할 수있는 방법을 절대로 사용하지 마십시오”-이것은 나쁜 설계를위한 레시피입니까? 아이디어입니다. SQL에서 순수하게 문제를 해결하려고 시도하면 특정

소수의 장소에서 반복해서 들었던 아이디어입니다. SQL에서 순수하게 문제를 해결하려고 시도하면 특정 수준의 복잡성을 초과한다는 사실을 어느 정도 인정하는 것이 실제로 코드에서 처리해야한다는 것입니다.

아이디어의 논리는 대부분의 경우 데이터베이스 엔진이 코드에서 할 수있는 것보다 작업을 완료하는 가장 효율적인 방법을 찾는 데 더 나은 작업을 수행한다는 것입니다. 특히 데이터에서 수행되는 작업에 대해 결과를 조건부로 만드는 것과 같은 경우에 특히 그렇습니다. 아마도 현대 엔진을 사용하면 쿼리의 컴파일 된 버전을 효과적으로 JIT + 캐싱 할 수 있습니다.

문제는 데이터베이스 엔진을 이런 식으로 활용하는 것이 본질적으로 나쁜 설계 관행인지 그 이유입니다. 모든 논리가 데이터베이스 내에 존재하고 ORM을 통해 명중하면 선이 더 흐려집니다.



답변

평신도의 말로 :

이것들은 SQL이 할 일 이며, 믿거 나 말거나, 코드에서 본 것입니다.

  • 조인 -코드 단위로 복잡한 배열 조작이 필요합니다.
  • 데이터 필터링 (어디서나)-코드 방식으로 목록에서 항목을 많이 삽입하고 삭제해야합니다.
  • 열 선택 -코드 방식으로 무거운 목록 또는 배열 조작이 필요합니다.
  • 집계 함수 -코드 방식으로 값과 복잡한 스위치 케이스를 보유하기 위해 배열이 필요합니다.
  • 외래 키 무결성 -코드 단위로 삽입하기 전에 쿼리가 필요하며 아무도 앱 외부의 데이터를 사용하지 않는다고 가정합니다.
  • 기본 키 무결성 -코드 단위로 삽입하기 전에 쿼리가 필요하며 아무도 앱 외부의 데이터를 사용하지 않는다고 가정

SQL 또는 RDBMS에 의존하는 대신 이러한 작업을 수행하면 값이 추가되지 않은 수많은 코드가 작성 되므로 디버그 및 유지 관리해야 할 코드가 더 많아집니다. 그리고 데이터베이스를 응용 프로그램을 통해서만 액세스 할 것이라고 위험합니다.


답변

나는 “당신을 위해 무엇을 할 수있는 SQL 서버 코드에서 할 절대로 해당 바꿔 것이 아니라 “.

문자열 조작, 정규식 작업 및 SQL Server에서 수행하지 않는 SQL CLR과 같은 것들.

위의 내용은 조인, 설정 작업 및 쿼리와 같은 것들에 대해 이야기하는 경향이 있습니다. 그 뒤에 의도는 많은 양의 리프팅을 SQL Server에 위임하고 가능한 한 IO의 양을 줄이는 것입니다 (SQL이 조인을 수행하고 WHERE절로 필터링 하여 많은 것을 반환하도록하십시오) 다른 것보다 작은 데이터 세트).


답변

SQL 서버가 당신 을 위해 할 수있는 것을 코드로 작성하지 마십시오 (강조는 내 것입니다)

대답의 핵심은 단순히 무언가를하는 것이 아니라 SQL이 잘하는 것을 찾아야한다는 것입니다. SQL은 놀랍도록 강력한 언어입니다. 내장 함수와 결합하여 잠재적으로 많은 일을 할 수 있습니다. 그러나 SQL에서 무언가를 할 수 있다는 사실이 실제로 SQL에서 그것을 수행하는 데 변명해서는 안됩니다.

결정을 내리는 구체적인 기준은 되 찾는 데이터의 양과 왕복 횟수를 확인하는 것입니다. 트립되면 작업이 서버에 속합니다. 왕복 횟수를 동시에 줄이지 않고 데이터 양이 동일하거나 증가하면 작업이 코드에 속합니다.

다음 예를 고려하십시오.

  • 생년월일을 저장하면 사용자 그룹의 연령을 계산해야합니다. SQL 서버에서 빼기를 수행하거나 코드에서 수행 할 수 있습니다. 왕복 횟수는 동일하게 유지되며 사용자에게 다시 전송되는 데이터 양이 증가합니다. 따라서 코드 기반 솔루션이 승리합니다
  • 생년월일을 저장하고 20 세에서 30 세 사이의 사용자를 찾아야합니다. 모든 사용자를 클라이언트에 다시로드하고 빼기를 수행하여 나이를 찾은 다음 필터링을 수행하고 논리는 SQL Server로 전달할 수 있습니다. 추가 왕복을 요구하지 않고 데이터 양을 줄입니다. 따라서 SQL 기반 솔루션이 승리합니다.

답변

간단히 말해서 , ” 코드베이스에서 데이터베이스 특정 작업 을 수행하지 마십시오”라고 말하는 것이 정확 합니다.

기본 설정 조작의 예를보십시오 . 아시다시피 RDBMS 는 일반적인 데이터 저장 및 조작 작업을 처리하도록 구축되었습니다.

또한 데이터베이스의 프로젝트 선택은 중요한 역할을 합니다. RDBMS (MS SQL, Oracle 등)를 갖는 것은 RavenDB와 같은 NoSQL 데이터베이스와 다릅니다.


답변

일반적으로 DB에는 애플리케이션보다 많은 정보가 있으며 일반적인 데이터 작업을보다 효율적으로 수행 할 수 있습니다. 예를 들어, 데이터베이스는 색인을 유지 관리하는 반면 응용 프로그램은 검색 결과를 즉시 색인화해야합니다. 따라서 다른 모든 것이 동일하면 응용 프로그램이 아닌 데이터베이스로 작업을 푸시하여 전체 작업 부하를 줄일 수 있습니다.

그러나 제품이 확장되면 일반적으로 DB를 확장하는 것보다 앱을 확장하는 것이 더 쉬워집니다. 대규모 설치에서는 응용 프로그램 서버가 데이터베이스 서버보다 10 대 1 이상 많은 경우가 드물지 않습니다. 더 많은 응용 프로그램 서버를 추가하는 것은 기존 서버를 새로운 하드웨어에 복제하는 간단한 문제입니다. 반면에 새 데이터베이스 서버를 추가하는 것은 대부분의 경우에 훨씬 더 어렵습니다.

따라서이 시점에서 진언은 데이터베이스를 보호하게됩니다 . 데이터베이스 결과를 캐싱 memcached하거나 응용 프로그램 측 로그의 업데이트를 큐 에 넣거나 데이터를 한 번 가져오고 앱에서 통계를 계산하면 데이터베이스 워크로드를 획기적으로 줄일 수 있습니다. 훨씬 더 복잡하고 취약한 DB 클러스터 구성.


답변

데이터베이스를 원래 용도로 사용하지 않는 것이 좋지 않은 디자인이라고 생각합니다. 좋은 데이터를 가진 데이터베이스 외부에서 규칙이 적용되는 데이터베이스는 본 적이 없습니다. 그리고 수백 개의 데이터베이스를 살펴 보았습니다.

따라서 데이터베이스에서 수행해야 할 사항 :

  • 감사 (애플리케이션 전용 감사는 데이터베이스의 모든 변경 사항을 추적하지 않으므로 무가치합니다).

  • 모든 데이터에 항상 적용해야하는 기본값, 외래 키 제약 조건 및 규칙을 포함하여 데이터 비구 속성 제약 조건 모든 데이터가 항상 응용 프로그램을 통해 변경되거나 삽입되는 것은 아닙니다. 특히 한 번에 하나의 레코드를 수행하는 데 실용적이지 않은 대규모 데이터 세트의 일회성 데이터 수정이 있습니다 (수행해야 할 때 상태 1로 잘못 표시된 10 만 개의 레코드를 업데이트하십시오) 응용 프로그램 코드 버그로 인해 2이거나 회사 B가 회사 A를 구입했기 때문에 클라이언트 A에서 클라이언트 B로 모든 레코드를 업데이트하십시오.

  • JOINS 및 where 절 필터링 (네트워크를 통해 전송되는 레코드 수를 줄이기 위해)


답변

“조기 최적화는 컴퓨터 프로그래밍에서 모든 악의 근원 (대부분은 어쨌든)”- Donald Knuth

데이터베이스는 바로 그 것입니다. 응용 프로그램의 데이터 계층 그 임무는 응용 프로그램에 요청 된 데이터를 제공하고 제공된 데이터를 저장하는 것입니다. 응용 프로그램은 실제로 데이터와 작동하는 코드를 넣을 수있는 곳입니다. 표시, 확인 등

제목 줄에 감정이 점에 감탄하고, 정확하지만 (필터링의 핵심적 껄끄 러운, 투사 등 그룹화 한다 ,에있을 수 있습니다 “잘”의 정의를 케이스의 압도적 인 다수하면 DB에 남아있을) 주문. SQL Server가 높은 수준의 성능으로 실행할 수있는 작업은 많지만 시연 할 수있는 작업SQL Server가 격리되고 반복 가능한 방식으로 올바르게 작동한다는 것은 매우 적습니다. SQL Management Studio는 훌륭한 데이터베이스 IDE입니다 (특히 TOAD와 같이 다른 옵션을 사용했을 때).하지만 그중에는 제한이 있습니다. 먼저 사용하는 모든 작업 (또는 실행중인 모든 절차 코드) 아래의 DB)는 정의에 따라 “부작용”(프로세스 메모리 공간의 도메인 외부에있는 상태 변경)입니다. 또한 최신 IDE 및 도구를 사용하여 SQL Server의 절차 코드는 지금 막 관리 범위 코드 및 경로 분석을 사용하여 관리 코드가 측정 할 수있는 방식을 측정 할 수 있습니다. , Y 및 Z 및 테스트 X는 조건을 true로 만들고 절반을 실행하도록 설계되었으며 Y 및 Z는 “else”를 실행합니다. . 즉, 특정 시작 상태로 데이터베이스를 설정하고, 조치를 통해 데이터베이스 절차 코드를 실행하고, 예상되는 결과를 주장 할 수있는 테스트가 있다고 가정합니다.

이 모든 것은 대부분의 데이터 액세스 계층에서 제공하는 솔루션보다 훨씬 어렵고 복잡합니다. 데이터 계층 (그리고 그 문제에 대해 DAL)은 올바른 입력이 주어지면 작업을 수행하는 방법을 알고 코드가 올바른 입력을 제공하는지 테스트합니다. SP 및 트리거와 같은 절차 적 코드를 DB 외부로 유지하고 대신 애플리케이션 코드에서 이러한 유형의 작업을 수행함으로써 애플리케이션 코드가 훨씬 더 쉽게 실행됩니다.