문제

얼마 전 나는 동료들과 함께 지속성에 대해 논의했습니다. 도메인 모델 데이터베이스 수준에서 외래 키 제약 조건을 적용해야 하는지 여부입니다.

나의 첫 번째 반응은 관계형 데이터베이스의 사용 자체가 그러한 제약의 시행을 암시한다는 것이었지만 일부는 데이터베이스가 지속성 메커니즘으로만 보여야 하므로 비즈니스 로직을 데이터베이스에 배치하는 것을 피해야 한다고 주장했습니다.결국 외래 키 제약 조건을 사용하지 않게 되었습니다.

내 질문은 다음과 같습니다(너무 일반적이지 않기를 바랍니다).이러한 경우에 주요 제약 조건을 적용하는 것이 좋은 관행으로 간주됩니까?

도움이 되었습니까?

해결책

제약을 시행하지만 귀하의 비즈니스 로직

  • 아니 사업 데이터베이스의 논리 : 원리에 동의합니다. 그리고 당신의 경우 비 SQL 비즈니스 코드 의존합니다 데이터베이스 제약 조건에서 데이터베이스 일관성을 확인하려면 비즈니스 로직을 다시 생각해야합니다.
  • 데이터베이스 제약 조건이있는 것은 잘못된 것이 없습니다 게다가 비즈니스 논리에. 특히 외국 키 및 기타 고유 한 제약 조건과 같은 참조 무결성과 같은 것들이 쉽게 수행 할 수 있고 RDBM은 많은 유지 보수없이 매우 효율적으로 해당 작업을 수행하고 있기 때문입니다.
  • 사용하지 않겠습니까? 지수 데이터베이스에서도 그렇지 않기 때문입니다 전혀 지속성 관련?
  • 소프트웨어 버그를 찾고 수정하는 데 시간이 걸릴 수 있지만 분명히 FK에 대한 한 줄 스크립트를 작성하는 데 어려움을 겪었 기 때문에 일부 데이터를 잃어 버리거나 (더 나쁜) 일부 데이터를 잃어 버리는 데 더 많은 시간을 소비하고 싶지 않습니다. 정말 : 여기에서 무료로 무언가를 얻고 거절합니까?
  • edit-1] : 데이터베이스의 데이터가 관리 될 것임을 보장 할 수 있습니까? 신청서를 통해? 때때로 (매우 드물게 :-) 실수를 저지르고 코드를 정리하기 위해 일부 SQL 문을 실행하고, 상태를 업데이트 (오타로 인해 유효하지 않은 값) 등을 수행하는 경우 (매우 드물게 :)를 수행하는 전원 사용자는 항상 예외가있는 것 같습니다.
  • EDIT-2] : 건물 도메인 구동 모델은 좋은 DB 관리자를 고용하지 않는 변명이 아닙니다. ORM을 사용하는 것은 좋은 DB 개발자를 고용하지 않는 변명이 아닙니다.

그러나 당신과 당신의 팀이 글을 쓸 수 있다면 버그가없는 소프트웨어 코드에서 가능한 모든 예외 시나리오 (하드웨어/네트워크/더미 사용자/프로그래머 오류 실패 포함), "Hei, 왜 귀찮게하는지 처리하십시오. 불필요한 FK 제약 조건 .... " - -괴롭히는 사람-

다른 팁

나는 그렇게 생각합니다. 비즈니스 로직을 위한 것이 아니라 "나쁜" 데이터가 데이터베이스에 입력되는 것을 방지하는 것이라고 생각합니다.데이터베이스가 매우 커지면 이러한 제약 조건으로 인해 향후 골치 아픈 일이 방지됩니다.

이는 동일한 데이터에 대해 여러 개발자가 앱을 개발하는 경우 특히 효과적입니다.이렇게 하면 유효한 데이터만 입력할 수 있습니다.x개의 앱 대신 한 곳에서 제약 조건을 제어하는 ​​것은 확실히 유익합니다.

순수한 개발 방법론을 위해서는 정말 유용한 도구 (데이터베이스 수준 데이터 무결성)를 무시하고 있다고 생각합니다. 데이터베이스는 이런 종류의 일에 정말 능숙합니다.

어느 시점에서 모든 방법론이 무너지기 시작하고 실용적이어야합니다.

나는 그렇게 생각했지만 많은 자원 지향 시스템을 작성하기 시작한 이후로 내 의견이 바뀌 었습니다. 일반적으로, 데이터 조각을 검증하기 위해서는 외국의 주요 제약보다 훨씬 더 많은 것 (예 :”지정된 상태에있는 티켓은 유효한 "할당 된 _to"값 등을 가져야합니다. 이러한 모든 규칙은 어떤 종류의 검증 루틴에 배치되어야하며, 이론적으로는 그렇지 않을 수도 있습니다. 아프다 데이터베이스 수준에서 추가 유효성 검사를 받으려면 앱 레벨 유효성 검사가 작동하는 경우 외국의 주요 제약 조건을 확인하는 것은주기 낭비입니다. 그러나 훨씬 더 나쁜 것은 이제 데이터 모델에 대한 논리가 두 곳에서 반복되어 유효성 검사 코드와 데이터베이스 제약 조건을 반복했습니다.

이런 식으로 생각하십시오 : 다른 응용 프로그램 논리를 데이터베이스 (예 : 저장 절차를 통해)로 옮기고 싶습니까? 성과 고려 사항으로 강요받지 않았다면 대답은 일반적으로 "아니오"여야한다고 생각합니다.

"나의 첫 번째 반응은 관계형 데이터베이스를 매우 사용한다는 것이 그러한 제약의 시행을 암시했다는 것이었지만, 일부는 데이터베이스가 지속 메커니즘으로 여겨 져야한다고 주장했다. 따라서 우리는 어떤 비즈니스 로직을 배치하지 않아야한다고 주장했다. 결국 우리는 끝났다. 외국 키 제약을 사용하지 않음. "

그렇습니다. 평범한 대다수는 항상 숫자의 힘으로 이런 종류의 토론을 얻습니다.

여전히 그 전투와 싸우고 싶다면 상대방에게 "직접 데이터베이스 편집기"(Ala DB2-AID, Spufi, ...)를 사용하지 않으려는 방법과 데이터베이스를 손상시키지 않도록하는 방법 이러한 도구를 사용합니다 (정의상 프로그래밍 된 비즈니스 제약 조건을 우회).

도메인 기반 설계 패러다임을 따르고 싶다면 Aggregate 내의 모든 것에 대해 대답은 '예'이고 교차 Aggregate 링크에 대해서는 '아니오'입니다.

거의 모든 경우에 루트 자체가 삭제될 때 집계 루트 아래의 모든 항목도 삭제되기를 원하므로 이를 나타내는 외래 키가 있으면 계단식 삭제를 통해 데이터베이스 수준에서 이를 달성할 수 있습니다.DB 수준에서 이를 수행하고 싶지 않은 경우 리포지토리에서 계단식 삭제를 자체적으로 수행하도록 할 수도 있지만 요점은 여전히 ​​루트 없이 집계 하위 항목이 존재해서는 안 된다는 것입니다.

교차 집계 문제의 경우 둘 중 하나가 제거되면 어떤 일이 발생해야 하는지에 대한 비즈니스 결정을 처리하게 될 것입니다.확장성을 허용하기 위해 이를 비동기적으로 처리해야 하는 경우가 많으므로 결국 도메인 모델이 일관성을 갖게 됩니다.따라서 이러한 경우 하나 또는 다른 키가 존재하지 않을 수 있는 시간이 있으므로 외래 키를 적용하는 것은 의미가 없습니다.

도움이 되었기를 바랍니다!자세한 내용은 꼭 확인해 보세요. 도메인 중심 설계에 관한 Evans의 책 - 그리고 웹상의 많은 링크도 마찬가지입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top