단지 데이터를 쿼리하는 사람으로부터 관계가 중요하지 않습니다. 그러나 응용 관점에서 볼 때 매우 중요하지 않은 경우 매우 유용합니다.
예를 들어, 고객의 테이블을 가지고 주문 테이블을 말할 수 있습니다. 비즈니스 규칙은 고객이 처음 있지 않는 한 주문을 작성할 수 없다는 것입니다. 따라서 고객없이 SQL을 자유롭게 작성하여 업데이트/삽입 쿼리가 작동하지 않습니다. 그리고 고객을 삭제해야 할 경우 복잡한 삭제 SQL 문을 작성하지 않고 해당 고객의 모든 주문을 자동으로 삭제할 수 있습니다. 예를 들어 5 년 또는 10 년 이상 된 모든 고객을 삭제할 수 있습니다 (따라서 비활성 상태 임). 고객을 삭제하면 모든 주문도 삭제됩니다. (각 고객에 대한 하위 레코드를 삭제해야하는 경우 작성하는 것이 매우 어려운 쿼리입니다. 강제 적용을 사용하면 모든 하위 레코드가 자동 삭제됩니다 (강제 캐스케이드 삭제).
또한보고 관점에서 중요합니다. 이번 달에 모든 고객과 청구액 합계를 표시하는 쿼리를 작성하면 총 결과가 하나가됩니다. 그러나 고객을 표시하거나 포함하고 싶지 않다면 주문 테이블을 치고 총액을 얻을 수 있습니다. 문제는 RI가 없기 때문에 (우연히 또는 주문 양식을 실행하는 일부 사용자 만) 주문 정보 (총 금액 포함)를 입력했지만 고객이 없을 수도 있습니다.
이제 두 개의 다른 보고서/쿼리를 실행하면 총계가 다르다는 것을 알 수 있습니다. "왜"두 가지 보고서가 서로 다른지에 대한 복잡한 적용에서 매월 판매량에 대한 두 보고서가 서로 동의하지 않는 이유를 파악하기 위해 며칠이 걸릴 수도 있고 많은 데이터가 일주일에 걸릴 수도 있습니다. 고객이 없어도 시스템에 주문을 입력 할 수 없다는 비즈니스 규칙을 시행하면보고에서 그러한 오류를 제거 할 수 있습니다. 당신은 SQL을 완벽하게 사용하지만 많은 코드와 많은 데이터 입력 폼을 가지고 있다고 말할 수 있습니다. 어떻게하면 고객없이 주문을 입력하지 않아도 될까요? 데이터 입력 중 사용자는 해당 주문 양식으로 고객을 입력하는 것을 잊을 수 있습니다. 그리고 고객이 반드시 선택되어야한다는 것을 보증하기 위해 해당 주문 양식으로 코드를 작성하더라도 어쩌면 실수로 SQL을 작성하는 중에 고객없이 주문 레코드를 시스템에 삽입 할 수 있습니다. 그러나 귀하의 월간 고객 총 보고서 쿼리는 합계 주문 데이터에 가입 한 고객 레코드가 있다고 가정합니다.
그러나 일부 보고서는 주문 데이터에서만 실행되어야합니다 (월간 요약 총계는 고객을 포함 할 필요가 없습니다). 문제는 이제 고객이없는 총 데이터가있는 주문 레코드가있는 시스템 어딘가에 있습니다. 결과는 서로 다른 보고서이며 판매 총계는 이제 동의하지 않습니다. 이것은 명백한 악몽이다.
그래서 응용 프로그램 코드의 일부 버그 또는 오류가 발생하여 "고아"레코드가있는 관계형 데이터로 간주되는 내용이 발생할 수 있습니다. 비즈니스 규칙에 따라 고객이 지정되지 않은 상태에서 주문을 입력 할 수는 있지만 매월 판매 보고서에 해당 사실이 표시되거나 주문 테이블을 조회하고 고객을 포함하지 않는 쿼리는 해당 사실을 "확인"해야합니다 고객 레코드가 아직 종료되지 않았다고 쿼리합니다.
위의 내용은 GAZILLION 문제의 표면을 긁는 것일뿐입니다. 따라서 데이터에 단순한 quires를 작성하는 동안, 문제점은 시스템에서 올바르게 연관된 데이터입니까? 쓰레기가 나오는 쓰레기에 관한 오래된 말은 사실입니다.
SQL quires에서 다중 테이블로 데이터를 가져 오는 날이 끝나면 데이터와 관련 무결성 (RI)에 대한 가정을해야합니다. 따라서 고객 및 해당 주문 총계를 표시하기 위해 해당 쿼리를 작성하면 customers 테이블에서 ASSUME 및 drop 한 다음 orders 테이블에서 관계형 조인을 수행합니다. 그러나 고객 레코드가없는 주문이 있으면 쿼리가 올바른 값을 생성하지 않습니다.그리고 주문 테이블을 치는 보고서가 이제는 다른 결과를 만들어 낼 것입니다.
아무리 RI를 강요하면 우연히 주문을 할 수 없으며, 고객 기록을 작성하지 않은 상태에서 주문을 할 수 없습니다. 그러한 규칙을 시행하지 않으면 데이터에서 잘못된 결과가 발생합니다.
일반적인 복잡한 응용 프로그램에는 40 개 또는 70 개의 관련 테이블이 있습니다. 그리고 그 테이블들 중 어느 하나라도 부모 (또는 자녀) 레코드가 귀하의 사업 가정에 따라 올바르게 작성되었다고 가정하는 것으로 가정합니다.
여행 예약 시스템이있을 수 있습니다. 고객이 전화를 걸어 예금을 거절 할 수는 있지만 특정 투어에 예약하지는 못할 수도 있습니다. 이 설정을 허용하면 이번 달의 고객에 대한 쿼리와 예약 된 둘러보기에서이를 고려해야합니다. 그러나 비즈니스 규칙은 돈을 버는 시스템의 모든 고객이 반드시 투어에 예약되어야한다는 것입니다. 따라서 해당 정보를 얻기 위해 쿼리를 작성하면이 규칙이 고려됩니다.
항상 작성한 모든 쿼리가 둘 이상의 테이블의 데이터를 포함하는 것이 아니라면 관계형 데이터 적용으로 많은 이점을 얻지 못할 수 있습니다. 그러나 여러 테이블로 쿼리를 묶는 순간부터 쿼리를 작성하기 전에 해당 데이터에 대한 가정을 알아야합니다. 투어 예약없이 시스템에 입금 된 고객을 허용합니까? 이 규칙은 해당 쿼리를 작성하는 방법을 결정합니다. RI가 시행되면 고객 "예약"에 대해 쿼리 할 수 있으며 투어 이벤트에 첨부된다는 것을 알 수 있습니다. 예약 + 보증금에 예약이 필요하지 않은 경우에도 마찬가지입니다.하지만 해당 데이터에 대한 가정을 알고 있어야합니다.
데이터에 대한 가정을 기반으로 한 가정을 기반으로 데이터를 가져 오는 쿼리를 만드는 유일한 방법이 있습니다. 그리고 RI를 강요하는 경우, 최소한 데이터가 관련성이 있고 그 가정에 따라 설정되어야한다는 것을 알고 있어야합니다.
하루가 끝날 때까지? RI를 강요하지 않으면 서 비즈니스 응용 프로그램과 규칙을 모델링하는 데이터베이스를 만드는 사람은 누구나 방향없이 나침반없이 배를 만들 수 있습니다.
그리고 각 테이블의 데이터를 내보내는 데는 문제가 없습니다. 그러나 해당 데이터가 엉망이고 고아 레코드가있는 경우 잘못된 데이터 모델을 다른 데이터베이스로 내보내고 모든 문제점과 문제점이 남아 있습니다.
몇 가지 사항에 따라 다릅니다. 고급 사용자의 경우 자동 참조 무결성을 제외하고는 실제로 많은 것을 얻지 못할 것입니다. 코드를 효율적으로 처리 할 수는 없습니다. –
관련 (그러나 ODBC 용) : http://stackoverflow.com/q/38468546/3820271 – Andre