관계형 데이터베이스의 제약 조건-완전히 제거하지 않는 이유는 무엇입니까?


20

요즘 테이블 (SQL 서버 내부) 사이에 제약 조건을 구축 해야하는 이유가 있습니까? 그렇다면 언제? 내 영역의 대부분의 응용 프로그램은 개체 원칙을 기반으로하며 필요에 따라 테이블이 결합됩니다. 수요는 응용 프로그램의 요구를 기반으로합니다. 간단한 룩업을 위해 여러 개의 제한된 테이블을로드하지 않을 것이며 (조치 후) 다른 간단한 룩업이 필요합니다.

EntityContext, Linq2Data, NHibernate와 같은 ORM 도구는 또한 제약 조건을 자체적으로 처리하며, 적어도 서로에게 필요한 테이블을 알고 있습니다. 서버 내에서 제약 조건을 수행하는 것은 동일한 변경 사항을 두 번 (강제) 만드는 것입니까?

이것은 일반적으로 결정에 대한 질문이 아니지만이 데이터베이스는 상당히 다르게 설계되었습니다. 디자인은 규칙적으로 좋아 보이며 대부분 응용 프로그램에서 사용하는 객체를 반영합니다. 나를 방해하는 것은 "캐스케이드가 아닌"SQL Server 내부에 구성된 모든 제약 조건입니다. 즉, 새 데이터베이스 쿼리를 코딩 할 때 "검색 및 찾기"를 수행해야합니다. 일부 경우 단일 삭제를 위해 최대 10 단계의 정확한 순서가 필요합니다.

이것은 나를 놀라게하고 그것을 처리하는 방법을 모르겠습니다.

저의 단순한 세계에서, 그 설정은 제약이 대부분의 목적을 잃게 만듭니다. 설계에 대한 지식없이 호스트에서 데이터베이스에 액세스 한 경우에는 OK입니다.

이 시나리오에서 어떻게 행동 하시겠습니까?
db에서 모든 제약 조건을 제거하고 응용 프로그램 수준에서 유지하는 이유는 무엇입니까?


6
단일 ORM 도구를 통해 항상 데이터에 액세스 할 계획 이었습니까? 또는 사용중인 각 ORM 도구에서 모든 제약 조건을 올바르게 복제하는 "재미있는"계획을 세웠습니까?
Donal Fellows

1
Peter에 대한 나의 최근 의견에 따라 나는 동의해야한다. 모든 제약 조건을 코드 기반에 의존하고 db에서 제거하는 요점은 매우 좁 았으며 아마도 단기 응용 프로그램에 완전히 적용될 수 있습니다. 아마도 일부 RAD 개발자 / 프로젝트에도 해당됩니다.
독립

4
작은 nitpick : 테이블 "상관 관계"사이의 외래 키 연결을 호출하면 약간 혼란 스럽다고 생각합니다. 관계형 데이터베이스의 "관계"는 연결이 아니라 테이블 자체입니다. 특히 "관계형 디자인"에 대해 이야기 할 때 특히 테이블을 의미합니까, 아니면 외래 키를 의미합니까?
Thomas Padron-McCarthy

감사. 제약 조건을 위해 "테이블 간 연결"을 호출합니다. 따라서 테이블 설계 원칙 (테이블 구조)에 대한 "관계형 데이터베이스"를 볼 수있을 것입니다. "관계 대 객체"데이터베이스와 관련하여 더 정확한 설명은 "디자인 패턴"입니다.
독립

1
데이터베이스가 애플리케이션 코드보다 오래 지속됩니다. 또한 ORM은 응용 프로그램 성능을 저하 시키므로 적어도 특정 사용 사례에서는이를 무시할 가능성이 높습니다. 지금 그것을 모른다면 결국 알게 될 것입니다. samsaffron.com/archive/2011/03/30/... . 또한 모든 제약 조건을 제거하면 다른 실제 응용 프로그램에서 Excel을 사용하는 실행 파일에 이르기까지 다른 응용 프로그램에서 악용 될 때 데이터베이스가 자체 무결성을 완전히 보호 할 수 없습니다.
크레이그

답변:


46

DB에서 제약을 제거하지 않는 두 가지 일반적인 이유 :

  • ORM을 사용하거나 사용하지 않을 수 있는 더 많은 앱이 현재 또는 미래에 액세스 할 수 있습니다 . 이러한 앱 개발자가 모든 제약 조건을 충실하게 복제하더라도 (낮은 수준의 비 ORM 솔루션을 사용하는 것이 훨씬 어려울 수 있음) 항상 추가 작업입니다. 그리고 그렇지 않다면, 하나의 작은 생략만으로도 스키마 무결성을 깨뜨리기에 충분합니다 . 대부분의 회사에서 DB에 저장된 데이터는 비즈니스의 생명력이므로 모든 수단을 통해 무결성을 보장해야합니다. 그리고 이것을 달성하기 위해 노력하고 입증 된 가장 좋은 방법은 DB에 최대한 많은 제약 조건을 구현하는 것입니다.
  • 쿼리 최적화 프로그램은 DB 수준에 알려진 제약 조건에 크게 의존합니다. 제약 조건을 제거하면 쿼리 성능이 저하 될 수 있습니다 . 당신은 즉시 그것을 알아 차리지 못할 수도 있지만 언젠가는 당신을 때리게 될 것이고, 그때까지 쉽게 고치기에는 너무 늦을 수도 있습니다. 사물의 본질은 정확한 성능 측정과 근본 원인을 정확히 파악하기위한 세부 분석을 통해 신중하고 신중하게 설계를 개선 할 가능성이 가장 적을 때 최대로드 시간에 DB 성능이 저하되는 경향이 있다는 것입니다.

DB 스키마와 같은 구체적인 사례는 원래 ORM 도구에 의해 생성되었거나 관계형 환경에 대해 잘 모르는 사람이 설계 한 것처럼 들릴 수 있으므로 관계형 관점에서 차선책입니다. ORM보기와 일관성을 유지하면서보다 "자연적인"관계형 디자인으로 분석하고 개선하는 것이 좋습니다. 이 분석에 DB 전문가를 참여시키는 것이 유용 할 수 있습니다.


5
@Jonas, 그런 다음 DB 디자인과 관련하여 인식 된 문제에 대해 이야기하십시오. 관계형 및 객체 지향은 서로 다른 두 세계입니다. 다른 자체에 비해 "개선"도 아니며 자체 위치도 있습니다. 관계형 원칙에 따라 C # 앱을 디자인하는 것은 DB를 OO 방식으로 디자인하는 것만 큼 큰 실수입니다.
Péter Török

3
@Jonas, 업데이트 반영 : DB 스키마에 비해 겉보기에 단순한 것을 달성하기 위해 지나치게 복잡한 쿼리를 작성해야하는 경우 DB 디자인이 목적에 맞지 않거나 숙련되지 않았 음을 나타냅니다. 불쾌하게 행동하지 마십시오. SQL에 대한 경험이 어느 정도인지 명확하지 않습니다. 면책 조항으로서 저는 전문가가 아닙니다.)
Péter Török

1
나는 아마도 나 자신을 알아볼 수있게하기 위해 배울 표현이있을 것이다. :) 나는 질문과 답변을 다시 읽고 반대해야합니다. DB가 모든 제약 조건의 마스터가된다는 확실한 장점이 있습니다. 모든 시스템은 그로부터 설계되어야합니다. 코드베이스가 작업을 수행한다고 말하는 매우 좁은 견해. 모든 시스템이 제약 조건에 대한 자신의 결정을 내릴 수 있다면 잘못된 제안 된 관계와 전체 테이블이 고아로 구성되어 있습니다. 지금이 아니라면 나중에 다른 코더에서 발생합니다.
독립

8
"현재 또는 향후 더 많은 앱에서 액세스 할 수 있습니다." 사용자가 기다리는 동안 데이터베이스 문제를 해결하기 위해 원시 SQL 쿼리를 실행하는 일부 데이터베이스 관리자는 말할 것도 없습니다.
Thomas Padron-McCarthy

5
+1 : db가 비즈니스 데이터를 저장하는 경우 (앱 구성 등이 아니라) 데이터베이스가 현재 앱 외부로 확장되거나 현재 앱 외부로 확장 될 확률이 100 %에 도달합니다.
Binary Worrier

27

응용 프로그램은왔다 갔다 할 수 있지만 데이터는 영원히 남아 있습니다. 우리 회사의 DB는 30-40 세 이상이며 회사가 존재하는 한 계속 유지됩니다. 응용 프로그램이 변경되고 개발자가왔다 갔다합니다. 무결성과 논리 데이터 모델이 좋은 것이 좋습니다. 이렇게하면 복잡한 코드베이스를 거치지 않고도 데이터를보고 의미있는 이해를 얻을 수 있습니다. 이것은 또한보고에 크게 도움이됩니다. 또한 응용 프로그램은 버그를 가질 수 있고 가질 수 있으며 DB 제약 조건은 이에 대한 보호입니다. 내 기본 위치는 가능한 한 많은 제약 조건 (FK 및 검사)을 유지하는 것입니다.
제약 조건이없는 유일한 이유는 디자인 패턴 에서 계층 당 테이블 또는 성능 문제를 허용하지 않는 경우 입니다.


나는 당신이 여기서 매우 현명한 조언을하고 있다고 말할 것입니다. 내 의견은 RAD 개발 또는 응용 프로그램의 수명이 짧은 개발 환경에 더 잘 맞을 수 있습니다. 개발하는 동안 최소화 된 유지 관리를 위해.
독립

15

나를 방해하는 것은 "캐스케이드가 아닌"SQL Server 내부에 구성된 모든 제약 조건입니다.

그것은 나에게 방해가되지 않습니다. 그것은 누군가가 좋은 의미를 보여 주 었음을 의미합니다. 계단식 삭제는 종종 데이터베이스에 매우 좋지 않습니다. 우선 관련 테이블에 데이터가있는 경우 삭제가 실패하는 경우가 있습니다. 예를 들어, 과거에 주문을 한 고객이있는 경우, 고객이 삭제되기를 원하지 않거나 주문 대상에 대한 데이터를 잃어 버리고 계단식 삭제 woudl이 재무보고를 엉망으로 만드는 레코드를 제거합니다. .

개발자의 편의가 가장 중요하다고 생각하는 것 같습니다. 데이터베이스 세계에서 이것은 사실이 아닙니다. 데이터 무결성은 성능과 데이터 보안이 가장 먼저 따르는 가장 중요한 것입니다. 쿼리를 작성하는 데 시간이 더 걸리면 그렇게하십시오.

데이터베이스는 일반적으로 여러 응용 프로그램, 즉 하나 이상의 웹 사이트 또는 데스크톱 응용 프로그램,보고 응용 프로그램, 웹 서비스, 쿼리 창, ETL 프로세스 등에서 작동합니다. 데이터베이스 수준에서 제약 조건을 적용하지 않으면 먼저 무결성이 손실됩니다 해당 응용 프로그램 중 하나 인 데이터의 일부 규칙이 모든 규칙을 준수하지 않을 수 있습니다. 둘째, 나중에 다른 응용 프로그램을 사용하기로 결정한 경우 이러한 제약 조건을 여러 번 코딩하고 다시 작성해야합니다. 셋째, 응용 프로그램을 통해 발생하지 않는 일종의 데이터 유지 관리 작업을 수행해야하는지 (예를 들어 잘못된 고객 데이터 가져 오기에서 데이터 수정 또는 한 클라이언트에서 10,000,000 레코드 모두 변경) 여부를 미리 제어 할 수 없습니다. 회사가 경쟁 업체에 의해 구매 될 때 다른 고객에게). 일반적으로 응용 프로그램 개발자는


답변 감사합니다. 여러분이 이야기하는 모든 프로세스와 응용 프로그램 유형은 DAL과 통신해야합니다 (이에는 제약 조건이 포함됩니다). 그러나! 당신의 요점은 완벽하고 당신의 의견은 좋습니다. 주석 : 예. 개발을 쉽게하는 방법을 시도하는 경향이 있습니다. 나에게는 복잡성이 적을수록 잘못을 저지르는 방법이 줄어들 수 있습니다. 이것이 잘못 처리 되어도 "쉽고 빠르게 발전하고 싶지 않다"는 것은 아닙니다. 따라서 왜이 질문을 게시합니까! 이 시나리오 에서처럼 캐스케이드가 아닌 캐스케이드를 100 %가 아닌 의미로 선택했다면 누군가에게 합리적이라고 생각합니다. 이유를 찾아야합니다.
독립

@Jonas, 성능상의 이유도있을 수 있습니다. 자녀 기록의 수에 따라 다릅니다. 소규모 그룹을 삭제하고 있지만 수백만 개의 레코드가 트리거 될 수 있으면 일괄 처리를 수행하고 전체 프로세스가 수행되는 동안 모든 테이블을 잠그지 않는 것이 좋습니다. 일반적으로 많은 dbas는 삭제가 너무 많은 레코드에 영향을주는 경우 prod 시스템을 잠글 수 있으므로 이러한 이유로 인해 계단식 삭제를 허용하지 않습니다.
HLGEM

2
모든 프로세스가 DAL과 대화해서는 안됩니다. ETL 프로세스는 일반적으로 데이터베이스 수준에서 발생해야 할 일이 많지 않습니다 (클라이언트 구매와 같이). 또한 쿼리 창을 사용하여 일회성 변경을 수행하는 것을 금지 할 수 없습니다. 나는 시간이 지남에 따라 무결성 문제가 없었던 데이터베이스 수준에서 영사관을 시행하지 않은 데이터베이스를 본 적이 없다.
HLGEM

10

기본적으로 말한 어딘가를 읽었습니다 . 데이터는 응용 프로그램의 핵심입니다 . 만약 당신은 당신의 UI를 통해 오직 액세스 데이터 (그리고 내 말은 지금까지 연리지처럼, 영원히 ... 또는 어쨌든 응용 프로그램의 수명에 대한) 다음 필요하지 않은 데이터베이스 제약. 그러나 웹 서비스, 퍼블릭 API, 레이크 작업 / SQL 작업 / 크론 / 자동화 된 스크립트와 같이 앱 자체 이외의 데이터가 데이터를 만질 필요가있을 가능성이 있습니다. DB 제약 조건을 유지하여 도로.

나는 이것이 당신이 DRY를 적용 해서는 안되는 소프트웨어 개발의 한 영역이라고 굳게 믿는다. (그리고 나는 그 진술에 대한 비보를 충분히 기대하고있다). 데이터는 응용 프로그램의 핵심이자 영혼입니다. 수리를 넘어서 손상된 경우에는 게임 오버입니다. 필요한 모든 곳에서 제약 조건을 적용하는 것이 IMO의 가치가 있습니다. 이것이 DB 수준에 대한 트리거 및 제약 조건, 미들웨어에 대한 서버 측 유효성 검사 및 UI (웹 앱의 경우)에 대한 클라이언트 측 Javascript의 형태를 의미하는 경우 데이터가 항상 깨끗한 상태를 유지하는 것은 IMO가 필요합니다. .


6

ORM의 의미를 알고 있습니까? 객체 관계형 매핑. 인용 위키피디아 " 호환되지 않는 유형 시스템 간에 데이터를 변환하는 기술 ". 그렇습니다. 관계형 모델과 객체 모델은 서로 맞지 않습니다. ORM은 두 유형 시스템의 규칙을 모두 준수하여 상당히 좋은 변환을 수행합니다. RDBMS는 이러한 방식으로 구성되어 제한 조건을 사용하여 데이터 무결성을 달성합니다. 일반적으로 무결성은 매우 좋은 것이므로 ORM은 객체 데이터를 저장하기 위해 데이터 모델을 만들 때이를 사용하는 경향이 있습니다. ORM에 "비 연쇄"제약 조건을 사용해야 할 충분한 이유가있을 수 있습니다. 그리고 이로 인해 특정 객체를 생성 / 업데이트 / 삭제하는 대신 복잡한 쿼리를 수행해야하는 경우 ORM 설정에 문제가 있습니다.

관계형 개념을 성가신 것으로 생각한다면 왜 객체 데이터베이스를 사용하지 않습니까? 얼마 전 그들은 느리게 (대부분의 사람들이 여전히 RDBMS를 사용하는 이유입니다) 그러나 내가 들었던 것에서 조금 변경되었습니다. 모든 관계형 이쑤시개를 제거합니다. 단순히 물건을 넣고 물건을 꺼내십시오.


이 주제는 DB에서 제약 조건 기능을 제거하고 코드 기반 (예 : .net 말하기 : Entity / Linq2Sql) 내의 설정 / 개발에 의존합니다.
독립

예, 알고 있습니다. 그러나 제 요점은 먼저 제약 조건이 왜 존재하는지 이해 한 다음 왜이를 삭제하는 것이 나쁜 생각인지 이해해야한다는 것입니다.
Jacek Prucia 10

움직이는! 떨어 뜨리지 않았습니다. 나는 당신이 그 질문에 관한 지식을 후회하지 않았다는 것을 이해합니다.
독립

호환되지 않는 시스템 간에는 아무것도 이동할 수 없습니다. DB 제약 조건을 삭제하고 응용 프로그램 제약 조건을 도입하고 동일하게 작동하기를 희망합니다 (이것은 사실 일 수도 있고 거짓 일 수도 있음). 어쨌든 당신의 질문을 오해하면 진심으로 사과합니다.
Jacek Prucia

감사! "이동"은 문학 "이동"을 의미합니다. 이는 모든 시스템에서 응용 프로그램 제약 조건을 작성하는 것을 의미합니다. 동일한 DAL을 공유 할 수없는 각 시스템. 아주 좋은 예는 DB 관리자의 "무언가를 수정하는"직접 쿼리입니다. DB 제약 조건이없고 설계 지식이 부족하여 데이터가 고아가되거나 완전히 조롱 된 데이터가 발생할 수 있습니다.
독립

6

이것이 eBay가 한 일이며 아마도 세계에서 가장 큰 데이터베이스 중 하나 일 것입니다.

http://www.dba-oracle.com/oracle_news/news_ebay_massive_oracle.htm http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf

참조 무결성에 의해 성능이 향상되는 것에 대해 위에서 언급 한 내용에도 불구하고 실제로 성능이 저하 될 수 있습니다. 그렇기 때문에 방대한 데이터베이스가 제약 조건을 없애고 응용 프로그램 계층에서 작업을 수행 한 이유입니다. 그리고 내가 알 수있는 한 그것이 유일한 좋은 이유입니다.

이러한 제약 조건을 제거하면 데이터를 깨끗하게 유지하고 자체 문제를 일으키는 안전망을 근본적으로 풀 수 있습니다. 모든 것과 마찬가지로 그것은 균형을 잡는 행위입니다. 일반적으로 참조 무결성을 유지하는 것이 옳은 일이라고 생각합니다.

강력한 참조 무결성을 갖춘 개발 환경에서 일한 결과 개발자의 관점에서 볼 때 이것이 완전히 고통 스러울 수 있다는 것을 알고 있습니다. 종종 개발 환경에서 약간의 더티 데이터는 중요하지 않으며 행을 삭제하는 방법을 연구하는 데 1 시간 이상이 걸릴 수 있습니다. 그러나 제약 조건으로 인해 스키마가 명시 적으로 만들어 지므로 매우 유용 할 수도 있습니다.


마지막으로 나를 이해하는 사람 :-). 당신은 완전히 맞습니다, 균형은 여기서 정말 큰 포인트입니다. 전략적 포인트로 수행 할 경우 제약 조건을 응용 프로그램 수준으로 옮기는 것이 안전한 대안 일 수 있습니다. 강력한 제약 조건 / 무결성으로 인해 사이트에 대한 일부 URL을 사용하면 성능 저하가 입증 된 것이 좋습니다.
독립

10
네, 잊지 마세요 – 잊지 마세요 – Facebook 및 Amazon과 같은 Ebay는 데이터베이스의 99.99 %보다 큰 규모이며, 데이터베이스의 장점은 데이터베이스의 장점과 매우 다를 수 있습니다.
Tony Andrews

2
ANd ebay, Facebook, Amazon은 아마도 재무 및 회계 소프트웨어, 인벤토리 소프트웨어 또는 HR 데이터 또는 데이터 손실이 중요하지 않은 곳에서는 제약이없는 데이터베이스를 사용하지 않을 것입니다.
HLGEM

2
충분한 시간, 전문 지식 및 비용이 있다면 특정 요구에 맞게 RDBMS, 웹 서버 또는 운영 체제를 프로그래밍 할 수 있습니다.
JeffO

1
eBay는 대량의 데이터 이탈이 발생할 때까지 데이터베이스 서버의 대처 능력을 근본적으로 능가했으며 새로운 아키텍처에 수백만 달러를 투자했습니다. 하루에 수십억 건의 트랜잭션을 수행하는 경우, 제약 조건을 제거하고 eBay와 같이 완전히 대기열 기반의 트랜잭션이없고 대규모로 확장 가능한 시스템으로 이동하는 방법에 대해 연구해야합니다. 그렇지 않으면 데이터베이스 서버를 과소 평가하지 말고 모든 제약 조건을 제거하여 데이터베이스가 데이터 손상을 입지 않도록하십시오.
크레이그

4

첫째-내 대답 : 아니요. 데이터를 돌보기 위해 응용 프로그램에만 의존해서는 안됩니다.

ORM은 종종 "직접적인"DB 상호 작용에 대한 경멸의 문화를 장려하고 종종 정규화 / 참조 무결성을 희생하면서 큰 논쟁을 일으킨다. 테이블은 관계형 모델에 암시적인 디자인을 희생하면서 임의의 객체 계층에 강제로 매핑됩니다. OOP가 선호하는 디커플링은 애플리케이션이 데이터 구조에서 디자인을 느꼈을 때 여기서 희생 될 수있다. ORM은 큰 유용성을 보여 주었지만 SQL의 남용 또는 불신에 근거한 것으로 보입니다.

새로운 패러다임은 (재) 신흥입니다. 개발자 팀이 새로운 프로그래밍 방법론을 채택하기로 결정하면 ORM의 요구 사항에 따라 구조화 된 데이터에 어떤 영향을 미칩니 까?

@Jacek Prucia에 동의합니다. ORM은 RDBMS에 적합하지 않다고 생각합니다. 개인적으로 RDBMS에서 DBAL을 선택하거나 ORM과 함께 OODB를 선택합니다.


주제에 대한 대안을 말하기 위해 +1. 논쟁의 다른면은 물론 "어떤 데이터는 얼마나 나쁠 까?" 답은 취소 또는 수백만 달러의 은행 계좌에 돈을 삽입하는 것일 수 있습니다. 좋은 청소 루틴으로 제거 된 일부 고아 데이터뿐만 아니라. 이 주제의 요약은 유연성 비용의 일관성과 같습니다. 이는 db의 내용과 사용의 심각성에 전적으로 달려 있습니다.
독립

3

제약 조건은 데이터베이스 수준에서 일관성과 데이터 무결성을 보장하는 유일한 방법입니다. 물론 애플리케이션 코드를 사용하여 제약 조건을 적용 할 수 있지만 나중에 데이터를 직접 수정해야하는 경우에는 어떻게됩니까? 데이터 무결성을 유지하는 방법을 이해할 수 있지만 다른 사람은 그렇지 않을 수 있습니다. 데이터 수준에서 제약 조건을 유지하면 누군가가 이해하지 못하는 곳에서 원숭이를 놀아도 무결성이 보장됩니다.

또한 응용 프로그램을 다시 작성해야하지만 동일한 데이터베이스가 있어야한다고 가정 해 봅시다. 코드의 모든 제약 조건은 잘못된 데이터를 허용하면서 일부 항목을 막는 버그를 요구합니다.

개발할 때는 간단하게 유지하십시오. 제약 조건을 사용하면 가능합니다. (즉, 제약 조건에서 오류가 발생하면 동일한 오류를 사용자에게 다시 뱉지 마십시오. 오류를 이해할 수있게 만드십시오.)

(계단식 문제와 관련하여 : 그것은 좋은 일입니다. 모든 것을 올바르게하기 위해 계단식에 의존하기보다는 특정 다른 레코드를 먼저 삭제해야한다는 오류를 던지는 것을 선호합니다. 실제로 그렇게합니다.)


2

데이터베이스 제약 조건의 한 가지 문제점은 프로그램이 실패한 내용과 수정 방법에 대한 제한된 정보를 프로그램에 제공한다는 것입니다. 즉, 원활한 처리를 위해 응용 프로그램에서 제약 조건 검사를 반복해야하는 경우가 많으므로 데이터베이스 제약 조건 검사가 낭비됩니다.

이로 인해 데이터 무결성이 손상 될 위험이 있으므로 여기에서 장단점이 있습니다. 중요한 데이터의 경우 데이터 무결성을 보장하는 것이 거의 항상 성능보다 중요하며 데이터를 엉망으로 만드는 것보다 임의적 인 것처럼 보이더라도 트랜잭션을 실패하는 것이 훨씬 좋습니다.

따라서 제약 조건을 안전하게 제거하려면 제약 조건을 확인하지 않고도 데이터베이스를 변경할 수 없도록 데이터베이스 액세스를 보호해야합니다. 새로운 응용 프로그램을 작성하거나 데이터를 처리하는 임시 방법을 고안 할 때는 신뢰할 수 없습니다. 한 번의 실수만으로 데이터베이스가 손상 되었기 때문입니다.

따라서 데이터베이스 제약 조건을 없애려면 모든 응용 프로그램을 광범위하게 작성, 검토 및 테스트 할 수 있도록 데이터베이스로 수행 할 수있는 작업과 수행 할 수없는 작업을 미리 설정해야합니다. 모든 데이터베이스 요구 사항을 미리 설정해야하며 데이터베이스 요구 사항을 변경하려면 광범위한 작업이 필요합니다. 이것은 매우 특정한 경우에만 작동하는 얼어 붙은 폭포 방법입니다. (요구 사항을 설계, 구현 및 유지하는 것은 물 위를 걷는 것과 매우 유사합니다. 먼저 무언가를 얼려 야하며 충분히 얼지 않으면 결과가 비참 할 수 있습니다.)

이것이 작동하는 한 가지 사례는 PeopleSoft 및 SAP와 같은 대규모 엔터프라이즈 애플리케이션이며, 애플리케이션은 이미 거의 모든 작업을 수행하며이를 확장 할 수 있도록 신중하게 정의 된 방법이 있습니다. 매우 드문 다른 가능성이 있습니다.

따라서 매우 큰 엔터프라이즈 프로젝트에서 작업하거나 원치 않는 액체 물을 걸을 수 없다면 데이터베이스에 이러한 제약 조건을 남겨 두십시오.


1
답변 감사합니다. 이 프로젝트의 제약 조건은 DB에 있습니다! 나는 완전히 확신합니다 :). 또한 미래의 프로젝트와 다른 부분과의 토론에서 이것을 결정할 때 더 넓은 눈을 가질 것입니다.
독립

1
또한 제약 조건이 없으면 응용 프로그램 코드 자체에 제약이 가해 져서 문제가 발생했음을 감지 할 수 있습니다. 그건 그렇고, 데이터 불일치 또는 손상으로부터 데이터베이스를 저장 한 제약 조건에서 예제의 제약 조건을 위반 한 것과 동일한 응용 프로그램 코드입니다. 제약 조건을 사용한다고해서 성능이 자동으로 저하되는 것은 아니며 제약 조건을 사용하지 않으면 데이터베이스가 노출되어 자체 보호 할 수 없습니다.
크레이그
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.