도메인 기반 디자인은 안티 -SQL 패턴입니까?


43

나는 도메인 기반 디자인 (DDD)에 뛰어 들고 있으며 더 깊이 들어가면서 얻을 수없는 것이 있습니다. 내가 이해하는 것처럼 주요 요점은 도메인 로직 (Business Logic)을 인프라 (DB, 파일 시스템 등)에서 분리하는 것입니다.

내가 궁금한 것은 Material Resource Calculation Query와 같은 매우 복잡한 쿼리가있을 때 어떻게됩니까? 그런 종류의 쿼리에서는 SQL이 설계된 종류의 무거운 집합 작업을 사용합니다. 도메인 계층 내에서 이러한 계산을 수행하고 많은 세트로 작업하는 것은 SQL 기술을 버리는 것과 같습니다.

DDD 패턴은 도메인 계층을 변경하지 않고 MongoDB에 SQL Server와 같은 동일한 기능이 없다는 것을 알기 때문에 인프라에서 이러한 계산을 수행 할 수도 없습니다.

이것이 DDD 패턴의 함정입니까?


34
SQL은 관계형 대수를 처리하도록 설계되었지만 비즈니스 로직의 절반이 리팩토링하기 어렵고 테스트하기조차 어려운 소수의 SQL 함수에 묻혀 있다는 것을 깨닫는 것은 즐거운 날이 아닙니다. 따라서 이것을 친구와 재생할 수있는 도메인 레이어로 옮기면 나에게 호소력이 있습니다. 이것이 SQL 기술의 좋은 덩어리를 버리고 있습니까? 물론 SELECT / JOIN 만 사용하는 경우 SQL을 관리하기가 훨씬 쉽습니다.
Jared Goguen

30
@JaredGoguen 그러나 이것은 SQL 전문가가 아니라 기술 때문이 아니기 때문일 수 있습니다
Leonardo Mangano

2
@JimmyJames 내가 말하려고 한 것은 DDD가 제대로 구현되면 SQL Server에서 MongoDB로 전환하는 것과 같이 최소한의 노력으로 레이어를 변경할 수 있다는 것입니다. 그러나 SQL에 복잡한 쿼리가 있으면 기술적 차이로 인해 MongoDB로 전환 할 수 없을 수도 있습니다. 나는 분명한 말을했다고 생각합니다.
Leonardo Mangano

7
... is like throwing away the SQL technology특정 기술 이 무언가를 할 수 있다고해서 이것이 최선의 선택임을 의미하지는 않습니다. 일화적인 증거이지만 데이터베이스에 비즈니스 로직을 저장하고 장기간 유지 관리 문제로 인해 데이터베이스에서 마이그레이션하는 데 너무 많은 비즈니스를 만났습니다. 지나치게 단순화되었지만 데이터베이스는 데이터를 저장하기위한 것이고 프로그래밍 언어는 데이터를 변환하기위한 것입니다. 애플리케이션을 사용하여 데이터를 직접 저장하려는 것보다 더 이상 비즈니스 로직에 DB를 사용하고 싶지 않습니다.
Conor Mancone

8
SQL 자체는 DDD의 좋은 예입니다. 관련 데이터를 구성 할 때 사람들은 먼저 언어를 지정했습니다. SQL. 구현은 실제로 중요하지 않습니다. DB 관리자는 데이터베이스를 쿼리하기 위해 C / C ++를 알 필요가 없습니다. 마찬가지로 일정 예약 작업에 직면했을 때 일정 문제의 99 %에 해당하는 간단한 도메인 모델 인 CRON 구문 (mhdmw)이 나타났습니다. DDD의 핵심은 그것은 당신의 문제를 이해하고 문제 영역에서 작업 할 수있는 시스템을 마련하는 클래스 나 테이블 등을 만들 수 없습니다
slebetman

답변:


38

요즘에는 읽기 (쿼리)가 쓰기 (명령)와 다르게 처리되는 것을 볼 수 있습니다. 복잡한 쿼리가있는 시스템에서는 쿼리 자체가 도메인 모델을 통과 할 가능성이 거의 없습니다 (주로 쓰기 일관성 유지를 담당 함 ).

우리는 SQL 인 SQL을 렌더링해야한다는 것이 옳습니다. 따라서 읽기 주변에 최적화 된 데이터 모델을 설계하고 해당 데이터 모델의 쿼리는 일반적으로 도메인 모델을 포함하지 않는 코드 경로를 사용합니다 (일부 입력 유효성 검사를 제외 하고 쿼리의 매개 변수를 보장 함) 합리적).


13
+1 좋은 대답이지만이 개념에 적절한 이름 인 Command-Query Segregation을 지정해야합니다.
마이크

6
@Mike 읽기와 쓰기에 대해 완전히 다른 모델을 갖는 것은 CQS가 아니라 CQRS와 유사합니다.
앤디

3
"모델 읽기"가 도메인 모델이 아니거나 일부입니까? 저는 CQRS 전문가가 아니지만 항상 명령 모델이 클래식 도메인 모델과는 다르지만 읽기 모델은 아니라고 생각했습니다. 그래서 당신은 이것에 대한 예를 줄 수 있습니까?
Doc Brown

High Performance Mark가 오타에 주목하고 있음을 깨닫기 엔 너무 오래 걸렸습니다.
VoiceOfUnreason

@DocBrown-여기에 당신을 명확히하기위한 시도입니다-> cascadefaliure.vocumsineratio.com/2019/04/…
VoiceOfUnreason

20

내가 이해하는 것처럼 주요 요점은 도메인 로직 (Business Logic)을 인프라 (DB, 파일 시스템 등)에서 분리하는 것입니다.

이것은 오해의 기초입니다. DDD의 목적은 "이것은 SQL 서버에 있으므로 BL이 아니어야합니다."와 같이 하드 라인을 따라 사물을 분리하는 것이 아니라 DDD의 목적은 도메인을 분리하고 사이에 장벽을 만드는 것입니다. 도메인 의 내부를 다른 도메인의 내부와 완전히 분리 할 수 있으며 도메인간에 공유 외부를 정의 할 수 있습니다.

"SQL에 있음"을 BL / DL의 장벽으로 생각하지 마십시오. 대신 "이것은 내부 영역의 끝이다"를 장벽으로 생각하십시오.

각 도메인에는 다른 모든 도메인 에서 작동 할 수있는 외부 API가 있어야 합니다. 데이터 스토리지 계층 의 경우 데이터 스토리지 계층에 대해 CRUD (읽기 / 쓰기) 작업이 있어야합니다. 이 수단의 SQL 자체가 정말 장벽없는의 VIEWPROCEDURE구성 요소입니다. : 당신은 테이블에서 직접 읽어 본 적이해야 외부 소비자로, 우리는 걱정하지 말아야한다는 DDD는 우리에게 구현 세부입니다.

귀하의 예를 고려하십시오.

내가 궁금한 것은 Material Resource Calculation Query와 같은 매우 복잡한 쿼리가있을 때 어떻게됩니까? 그런 종류의 쿼리에서는 SQL이 설계된 종류의 무거운 집합 작업을 사용합니다.

이것은 정확히 SQL에 있어야하는 것이며 DDD를 위반하지 않습니다. 그건 우리가 DDD를 만들 었는지 . SQL에서 계산 하면 BL / DL의 일부 가됩니다 . 당신이 할 일은 별도의 뷰 / 저장 프로 시저 / 무엇을 가지고 있고 비즈니스 로직을 외부 API 와 같이 데이터 계층과 분리 하는 것 입니다. 실제로 데이터 계층은 다른 DDD 도메인 계층이어야하며, 데이터 계층에는 다른 도메인 계층과 작업하기위한 자체 추상화가 있습니다.

DDD 패턴은 도메인 계층을 변경하지 않고 MongoDB에 SQL Server와 같은 동일한 기능이 없다는 것을 알기 때문에 인프라에서 이러한 계산을 수행 할 수도 없습니다.

그것은 또 다른 오해입니다 : 그것은 구현 세부 사항이 다른 도메인 계층을 변경하지 않고 내부적으로 변경 될 수 있다고 말합니다 . 전체 인프라를 교체 할 수 있다고 말하는 것은 아닙니다 .

DDD는 잘 정의 된 외부 API로 내부를 숨기는 것에 관한 것입니다. API의 위치는 완전히 다른 질문이며 DDD는 그것을 정의하지 않습니다. 단순히 이러한 API가 존재 한다는 것을 정의 하며 절대로 변경해서는 안됩니다 .

DDD는 MSSQL을 MongoDB로 임시 대체 할 수 있도록 설정되지 않았습니다.이 두 가지는 완전히 다른 인프라 구성 요소입니다.

대신, DDD가 정의한 것에 대한 비유를 사용합시다 : 가스 대 전기 자동차. 두 차량에는 추진력을 생성하기위한 완전히 다른가지 방법이 있지만 온 / 오프, 스로틀 / 브레이크 및 차량을 추진하는 휠과 같은 API가 있습니다. DDD는 자동차의 엔진 (가스 또는 전기)을 교체 할 수 있어야한다고 말합니다. 자동차를 오토바이로 교체 할 수 있다고 말하는 것은 아니며, MSSQL → MongoDB의 효과입니다.


1
설명 주셔서 감사합니다. 나를 위해 매우 어려운 주제입니다, 모두가 다른 관점을 가지고 있습니다. 내가 동의하지 않는 유일한 것은 MSSQL (car)과 MongoDB (motorcycle)의 비교입니다. 나에게 올바른 비교는 이것들이 동일한 자동차에 대한 두 개의 다른 엔진이라는 것입니다. 그러나 그것은 단지 의견 일뿐입니다.
Leonardo Mangano

8
@LeonardoMangano 아, 그렇지 않습니다. MSSQL은 관계형 데이터베이스이고 MongoDB는 문서 데이터베이스입니다. 예, "데이터베이스"는 두 가지를 모두 설명하지만 그 정도는 아닙니다. 읽기 / 쓰기 기술은 완전히 다릅니다. 대신 MongoDB를, 당신은 대안으로 Postgre이나 MySQL을 사용 수 있으며, 그것은 유효한 비교 될 것이다.
410_4

3
"테이블에서 직접 읽어서는 안됩니다 ..."광기.
jpmc26

"테이블에서 직접 읽지 말아야합니다 ..."이것은 데이터베이스와 인터페이스하고 주위에 구조화 된 튜토리얼을 따라야하는 초기의 고통을 겪고있는 소프트웨어를 작성한 10 년 후에 독자적으로 구현하게 된 규칙입니다. 대중적인 디자인 패턴.
루시퍼 샘

@LuciferSam Aye. 구현 세부 사항과 도메인 경계 간의 구분을 훨씬 쉽게 관리 할 수 ​​있습니다. 도메인에서 하나의 "객체"는 5 개의 테이블로 표시 될 수 있으므로 View를 사용하여 해당 객체를 캡슐화합니다.
410_5

18

애플리케이션 호스팅 비용을 지불하는 조직이 데이터베이스 계층 라이센스가 너무 비싸다고 결정한 프로젝트를 수행 한 적이 있다면 데이터베이스 / 데이터 스토리지를 쉽게 마이그레이션 할 수 있습니다. 모든 것이 고려되지만 , 이런 일이 발생하지만 자주 발생하지는 않습니다 .

당신은 말하기 위해 두 세계의 최고를 얻을 수 있습니다. 데이터베이스에서 복잡한 기능을 최적화하는 것을 고려하면 인터페이스를 사용하여 대체 계산 구현을 삽입 할 수 있습니다. 문제는 여러 위치에서 논리를 유지해야한다는 것입니다.

건축 패턴에서 벗어남

패턴을 순전히 구현하거나 일부 영역을 벗어나는 데 어려움을 겪게되면 결정해야합니다. 패턴은 단순히 프로젝트를 구성하는 데 도움이되는 일을하는 템플릿 화 된 방법입니다. 이 시점에서 다음을 평가하는 데 시간이 걸립니다.

  • 이것이 올바른 패턴입니까? (많은 시간이지만 때로는 때로는 적합하지 않습니다)
  • 이 방법으로 벗어나야합니까?
  • 내가 지금까지 얼마나 멀리 벗어 났습니까?

일부 아키텍처 패턴은 응용 프로그램의 80-90 %에 적합하지만 나머지 비트에는 그다지 적합하지 않습니다. 규정 된 패턴에서 가끔 벗어나는 것은 성능 또는 물류상의 이유로 유용합니다.

그러나 누적 편차가 응용 프로그램 아키텍처의 20 % 이상을 차지할 경우 적합하지 않을 수 있습니다.

아키텍처를 계속 사용하기로 선택한 경우, 선호하는 방식으로 문서화 된 작업 방식에서 벗어난 위치와 이유를 문서화하십시오. 팀에 새로운 열정을 가진 멤버가 생기면 성과 측정 및 정당성이 포함 된 해당 문서를 가리킬 수 있습니다. 이렇게하면 "문제"를 해결하기 위해 반복 요청이 발생할 가능성이 줄어 듭니다. 이 문서는 만연한 편차를 줄이는 데 도움이 될 것입니다.


답변에 "이것이 올바른 패턴입니까?"와 같은 문구를 사용하지 마십시오. 사람들이 질문을 작성할 때 구체적으로 설명하는 것은 어렵고 자신의 입학 허가에 따라 "때로는 적합하지 않다"는 것이 아니라는 것을 의미합니다.
Robert Harvey

@RobertHarvey, 사용 된 패턴이 응용 프로그램에 적합하지 않은 프로젝트에 있었기 때문에 특정 품질 메트릭이 실패했습니다. 그것은 반드시 표준은 아니지만, 그런 일이 발생하면 아키텍처를 변경하거나 슈 호닝 코드를 앱에 유지하려는 어려운 결정을 내립니다. 잘못된 맞춤을 빨리 파악할수록 수정하기가 더 쉽습니다. 그렇기 때문에 항상 최첨단 사례를 평가하면서 그 생각을 포함시키는 것입니다. 마지막 글 머리 기호와 함께 때때로 편차가 누적 될 때까지 얼마나 적합하지 않은지 알 수 없습니다.
Berin Loritsch

6

SQL에 능숙한 세트 조작 로직은 DDD와 아무런 문제없이 통합 될 수 있습니다.

예를 들어 유형별 총 제품 수에 대한 집계 값을 알아야한다고 가정 해보십시오. SQL에서 실행하기 쉽지만 모든 제품을 메모리에로드하고 모두 추가하면 느려집니다.

새로운 도메인 객체를 소개합니다.

ProductInventory
{
    ProductType
    TotalCount
    DateTimeTaken
}

내 저장소의 방법

ProductRepository
{
    List<ProductInventory> TakeInventory(DateTime asOfDate) {...}
}

물론, 현재 특정 능력을 가진 DB에 의존하고 있습니다. 그러나 나는 여전히 기술적으로 분리되어 있으며 논리가 단순하다면 '비즈니스 논리'가 아니라고 주장 할 수 있습니다.


글쎄, 지금까지 나는 회상한다. 리포지토리 Query도 매개 변수로 사용됩니다. repository.find(query);. 나는 인프라 레이어에 Specs. That opens a door to leave 대한 추상화 및 QueryImpl특정 쿼리 구현과 같은 쿼리를 읽었습니다 .
Laiv

5
세상에, 나는 어떤 사람들이 그렇게하는 것을 알고 있지만 그것이 끔찍하다고 생각합니다. 이런 종류의 것을 그 길을 따라 내려가는 것으로 볼 수 있습니다. 그러나 나는 조심스럽게 취할 수 있다고 생각합니다.
Ewan

I know some people do that일부 사람들은 Pivotal과 그 프레임 워크입니다. SpringFramework에는 많은 것들이 있습니다 :-). 어쨌든 @VoiceOfUnreason이 제안했듯이 DDD의 핵심은 글의 일관성을 유지하는 것입니다. 쿼리를 쿼리하거나 매개 변수화하는 목적을 가진 도메인 모델을 사용하여 디자인을 강요 할 지 확신이 없습니다. 데이터 구조 (pocos, pojos, dtos, row mappers 등)를 사용하여 도메인 외부에서 접근 할 수 있습니다.
Laiv

분명히 우리는 그 사람들이 건강을 회복하도록 돕기 위해 일종의 조사가 필요합니다. 그러나 나는 내 총을 고집하고있다. "도메인 객체"가 주관적인 것이 아닌 주관적인 응용 프로그램을 객관적으로 만들 때 데이터 계층의 부분 노출은 허용됩니다.
Ewan

1
@LeonardoMangano는 응용 프로그램 및 구현에 따라 다릅니다. 알아야 할 주요 사항은 도메인을 재 해석하여 실행 가능하게 만들 수 있다는 것입니다.
Ewan

3

이 딜레마를 해결하는 가능한 방법 중 하나는 SQL을 어셈블리 언어로 생각하는 것입니다. / C ++ / Golang / Rust 컴파일러는 원하는 기계어 코드를 생성하기 위해 고급 언어로 코드를 변경할 수없는 경우 어셈블리에서 작은 스 니펫을 작성할 수도 있습니다.

마찬가지로 데이터베이스 및 SQL 영역에서 SQLAlchemy 및 Django ORM for Python, LINQ for .NET 과 같은 다양한 SQL 라이브러리 (일부 ORM ) 는 더 높은 수준의 추상화를 제공하지만 가능한 경우 생성 된 SQL 코드를 사용하여 성능을 달성합니다. 또한 더 최적화 된 DB 관련 SQL을 사용하는 일부 작업으로 인해 Postgres 및 MySQL과 같이 다른 성능을 가진 사용 된 DB에 대한 이식성을 제공합니다.

또한 고급 언어와 마찬가지로 위에서 언급 한 SQL 라이브러리로 수행 한 쿼리를 다시 정렬하더라도 원하는 효율성을 달성 할 수 있도록 SQL이 작동하는 방식을 이해하는 것이 중요합니다.

추신 : 나는 이것을 주석으로 만들고 싶지만 그것에 대한 명성이 충분하지 않습니다.


2

평소와 같이, 이것은 여러 가지 요인에 의존하는 것들 중 하나입니다. SQL로 할 수있는 일이 많다는 것은 사실입니다. 또한이를 사용하는 데 어려움이 있으며 관계형 데이터베이스의 일부 실제적인 한계가 있습니다.

Jared Goguen이 주석에서 언급했듯이 SQL은 테스트 및 검증이 매우 어려울 수 있습니다. 이를 일으키는 주요 요인은 일반적으로 구성 요소로 분해 할 수 없다는 것입니다. 실제로는 복잡한 쿼리를 토토에서 고려해야합니다. 또 다른 복잡한 요소는 SQL의 동작과 정확성이 데이터의 구조와 내용에 크게 의존한다는 것입니다. 이는 가능한 모든 시나리오를 테스트하거나 상황을 결정하는 것이 종종 불가능하거나 불가능하다는 것을 의미합니다. SQL 리팩토링 및 데이터베이스 구조 수정도 마찬가지로 문제가됩니다.

SQL에서 멀어지게하는 또 다른 큰 요인은 관계형 데이터베이스가 수직으로 만 확장되는 경향이 있다는 것입니다. 예를 들어, SQL에서 복잡한 계산을 작성하여 SQL Server에서 실행하면 데이터베이스에서 실행됩니다. 이는 모든 작업이 데이터베이스에서 리소스를 사용하고 있음을 의미합니다. SQL에서할수록 메모리와 CPU 측면에서 데이터베이스에 더 많은 리소스가 필요합니다. 다른 시스템에서 이러한 작업을 수행하는 것은 종종 비효율적이지만 이러한 솔루션에 추가 할 수있는 추가 시스템 수에는 실질적인 제한이 없습니다. 이 방법은 몬스터 데이터베이스 서버를 구축하는 것보다 비용이 적게 들고 내결함성이 있습니다.

이러한 문제는 현재 문제에 적용되거나 적용되지 않을 수 있습니다. 사용 가능한 데이터베이스 자원으로 문제점을 해결할 수있는 경우 문제점 공간에 SQL이 적합 할 수 있습니다. 그러나 성장을 고려해야합니다. 오늘은 괜찮을지 모르지만 몇 년 동안 추가 리소스를 추가하는 비용이 문제가 될 수 있습니다.


괴물 데이터베이스에 대한 대안이 아닌 단순한 보조 시스템의 괴물 수와 다양성입니까? 보조 시스템이 코어 시스템에서 모두 정지되는 경우 보조 시스템에는 어떤 복원력이 있습니까? 정당화가 단순히 핵심 시스템의 기술적 한계라면 대부분의 비즈니스 시스템에서 조기 최적화가 될 것입니다. 필요한 경우 일반적으로 SQL을 분리 된 방식으로 작성할 수 있습니다.
스티브

@Steve 나는 당신이 잘못한 곳이 다른 사람들이 '중지'하는 단일 코어 시스템이 있어야한다고 가정합니다.
JimmyJames

@Steve 예를 들어, 시스템 전체 데이터베이스를 하나의 SQL이 아닌 단일 데이터베이스로 교체 할 수 있습니다 (이것이 항상 올바른 선택이라고 말할 수는 없습니다.) 시스템, 심지어 지리적 인 지역. 이러한 DB는 보조가 아니며 SQL DB를 도매로 대체 한 것입니다.
JimmyJames

@JimmyJames는 동의했지만 핵심 시스템이없는 경우 종속성을 분석하고 데이터 일관성을 유지하는 데 자체 문제가 발생할 수 있습니다. 그것이 모놀리스의 첫 번째 이유입니다-그들은 특정 종류의 단순성을 생성하므로 특정 종류의 분석 및 유지 보수 효율성을 창출합니다. 비모 놀리 식 솔루션은 단순히 일부 문제 나 비용을 다른 문제와 교환합니다.
스티브

@jmoreno 내가 좋은 설계라고 부르는 그것과 함께 림프하기 위해 뭔가를 자원하지 않는 던지는 : "사이트의 대규모 데이터 볼륨을 처리하기 위해, 그리고 트랜잭션의 수와 유지하기 위해 memcached를 9,000 인스턴스를 실행 데이터베이스가 제공되어야합니다. " 당신은 당신의 디자인의 비용을 고려합니까 아니면 당신은 당신의 개인적인 취향을 실행 가능하게하기 위해 누군가 돈을 낼 것이라고 생각합니까?
JimmyJames

2

이것이 DDD 패턴의 함정입니까?

먼저 몇 가지 오해를 정리하겠습니다.

DDD는 패턴이 아닙니다. 그리고 실제로 패턴을 규정하지는 않습니다.

에릭 에반의 DDD 책 서문 은 다음과 같이 말합니다.

주요 소프트웨어 설계자들은 도메인 모델링과 디자인을 20 년 이상 중요한 주제로 인식 해 왔지만 놀랍게도 수행해야 할 작업이나 수행 방법에 대해서는 거의 기록하지 않았습니다. 그것이 명확하게 공식화되지는 않았지만, 철학은 객체 커뮤니티에서 저류로 등장했습니다. 필자는 도메인 중심 디자인이라고 부릅니다.

[...]

성공에 공통적 인 기능은 디자인의 반복을 통해 진화하고 프로젝트 패브릭의 일부가 된 풍부한 도메인 모델이었습니다.

이 책은 디자인 결정을위한 프레임 워크와 도메인 디자인을 논의하기위한 기술 용어를 제공합니다. 그것은 내 통찰력과 경험과 함께 널리 인정되는 모범 사례를 종합 한 것입니다.

따라서 소프트웨어 개발 및 도메인 모델링에 접근하는 방법과 이러한 활동을 지원하는 일부 기술 용어 (다양한 개념과 패턴을 포함하는 단어)입니다. 또한 완전히 새로운 것이 아닙니다.

명심해야 할 또 다른 사항은 도메인 모델이 시스템에서 찾을 수있는 OO 구현 이 아니라는 것입니다. 이는이를 표현하거나 일부를 표현하는 한 가지 방법 일뿐입니다. 도메인 모델은 소프트웨어로 해결하려는 문제에 대해 생각하는 방식 입니다. 그것은 당신이 물건을 이해하고 인식하는 방법입니다. 그것은의 개념 . 그러나 모호한 의미는 아닙니다. 깊고 세련되었으며 열심히 일하고 지식을 수집 한 결과입니다. 시간이 지남에 따라 더 정교 해지고 발전 할 수 있으며 구현 고려 사항이 포함됩니다 (일부는 모델을 제한 할 수 있음). 모든 팀원공유 해야합니다. (및 관련 도메인 전문가) 및 시스템 구현 방식을 추진하여 시스템이이를 반영하도록합니다.

OO 개발자는 일반적으로 OO 언어로 모델을 표현하는 것이 더 좋을 수도 있지만 OOP는 많은 도메인 개념의 표현을 더 잘 지원할 수 있지만 그에 대한 것은 본질적으로 프로 SQL 또는 안티 SQL이 아닙니다. 그러나 때로는 모델의 일부가 다른 패러다임으로 표현되어야합니다.

내가 궁금한 것은 매우 복잡한 쿼리가있을 때 어떻게됩니까 [...]?

일반적으로 여기에는 두 가지 시나리오가 있습니다.

첫 번째 경우, 도메인의 일부 측면에는 실제로 복잡한 쿼리가 필요하며 해당 측면은 SQL / 관계형 패러다임에 가장 잘 표현 될 수 있으므로 작업에 적합한 도구를 사용하십시오. 도메인 사고와 개념 전달에 사용되는 언어의 측면을 반영하십시오. 도메인이 복잡한 경우, 이는 고유 한 컨텍스트가있는 하위 도메인의 일부일 수 있습니다.

다른 시나리오는 SQL로 무언가를 표현해야한다는 인식이 제약 된 사고의 결과라는 것입니다. 개인이나 팀이 항상 데이터베이스 지향적 사고를한다면 관성으로 인해 다른 방식으로 접근하는 것이 어려울 수 있습니다. 이것은 구식 방법이 새로운 요구를 충족시키지 못할 때 문제가되며, 즉시 다른 사고가 필요합니다. 디자인에 대한 접근 방식 인 DDD는 부분적으로 도메인에 대한 지식을 수집하고 추출하여 상자에서 벗어날 수있는 방법에 관한 것입니다. 그러나 모든 사람들은이 책의 그 부분을 무시하는 것 같으며 기술적 인 어휘와 패턴 중 일부에 중점을 둡니다.


0

관계형 데이터 모델은 데이터를 정규화하고 파일 시스템에 효과적으로 저장할 수있는 가능성을 제공했기 때문에 메모리가 비쌀 때 Sequel이 인기를 얻었습니다.

메모리는 상대적으로 저렴하므로 정규화를 건너 뛰고 사용하는 형식으로 저장하거나 속도를 위해 동일한 데이터를 많이 복제 할 수 있습니다.

데이터베이스를 파일 시스템에 데이터를 저장할 책임이있는 간단한 IO 장치로 간주하십시오. 예, SQL 쿼리에 작성된 중요한 비즈니스 논리를 가진 많은 응용 프로그램을 작성했기 때문에 상상하기 어렵다는 것을 알고 있습니다. 그러나 SQL Server를 상상해보십시오. 다른 프린터 일뿐입니다.

프린터에서 PDF 생성기를 내장하거나 프린터에서 인쇄 된 모든 판매 주문에 대한 로그 페이지를 인쇄하는 트리거를 추가 하시겠습니까?

우리는 응용 프로그램이 특정 장치 유형에 연결되기를 원하지 않기 때문에 대답이 아니요라고 가정합니다 (이러한 아이디어의 효율성에 대해서도 이야기하지 않음)

70 년대에서 90 년대에 SQL 데이터베이스가 효율적 이었습니까? 확실하지 않은 일부 시나리오에서는 비동기 데이터 쿼리가 SQL 쿼리의 여러 조인보다 필요한 데이터를 빠르게 반환합니다.

SQL은 복잡한 쿼리를 위해 설계된 것이 아니라 효율적인 방식으로 데이터를 저장 한 다음 저장된 데이터를 쿼리하기위한 인터페이스 / 언어를 제공하도록 설계되었습니다.

복잡한 쿼리로 관계형 데이터 모델을 중심으로 응용 프로그램을 작성하는 것은 데이터베이스 엔진의 남용이라고 말합니다. 물론 데이터베이스 엔진 공급자는 비즈니스를 제품에 긴밀하게 연결할 때 행복합니다. 더 강력한 기능을 제공하는 더 많은 기능을 제공하는 것이 행복 할 것입니다.


1
그러나 SQL은 다른 언어보다 집합 계산에 더 좋습니다. 내 관점에서. 귀하의 예는 거꾸로되어 있습니다. 수백만 행의 매우 복잡한 집합 작업에 C #을 사용하고 관련된 조인이 잘못된 도구를 사용하고 있지만 잘못되었을 수 있습니다.
레오나르도 망가 노

@LeonardoMangano, 몇 가지 예 : c #을 사용하면 수백만 행을 청크하고 병렬로 계산할 수 있으며 데이터를 반환 할 때 데이터를 비동기 적으로 검색하고 계산을 "시간에"실행할 수 있습니다 .c #을 사용하면 행을 열거하여 메모리 사용량이 적은 계산을 수행 할 수 있습니다 행별로. 코드에 복잡한 논리가 있으면 계산 방법에 대한 많은 옵션이 제공됩니다.
Fabio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.