RDBMS에 대한 데이터베이스 모델을 검토 할 때 일반적으로 제약 조건 (PK / FK 제외)이 거의 없거나 전혀없는 것이 놀랍습니다. 예를 들어, 백분율은 종종 유형의 열에 저장되며 int
( tinyint
보다 적절할 수 있음) CHECK
값을 0..100 범위로 제한 할 제약 이 없습니다 . SE.SE와 마찬가지로 검사 제한 조건을 제안하는 응답은 종종 데이터베이스가 제한 조건에 대한 잘못된 위치임을 제안하는 주석 을 받습니다 .
제약 조건을 이행하지 않기로 한 결정에 대해 질문 할 때 팀 구성원은 다음과 같이 응답합니다.
그들은 그러한 기능이 선호하는 데이터베이스에 존재한다는 것을 알지 못합니다. ORM을 사용하는 프로그래머는 이해할 수 있지만 주어진 RDBMS에 대해 5 년 이상 경험이 있다고 주장하는 DBA는 훨씬 적습니다.
또는 응용 프로그램 수준에서 이러한 제약 조건을 적용하고 데이터베이스에서 이러한 규칙을 복제하는 것은 SSOT를 위반하는 좋은 생각이 아닙니다.
최근에는 외래 키를 사용하지 않는 점점 더 많은 프로젝트가 있습니다. 마찬가지로, 여기 SE.SE에 대한 몇 가지 코멘트를 본 적이 보여 사용자가 응용 프로그램 핸들을시키는, 참조 무결성에 대해 많은 관심을하지 않는 것이 있습니다.
팀에게 FK를 사용하지 않도록 선택할 때 다음과 같이 말합니다.
예를 들어 다른 테이블에서 참조되는 요소를 제거해야 할 때 PITA입니다.
NoSQL은 흔들리고 외래 키는 없습니다. 따라서 RDBMS에서는 필요하지 않습니다.
성능 측면에서 큰 문제는 아닙니다 (컨텍스트는 일반적으로 작은 데이터 세트에서 작동하는 작은 인트라넷 웹 응용 프로그램이므로 실제로 색인조차 중요하지 않습니다. 주어진 쿼리의 성능이 1.5 초에서 지나친다면 아무도 신경 쓰지 않습니다) ~ 20ms)
응용 프로그램 자체를 보면 체계적으로 두 가지 패턴이 있습니다.
응용 프로그램은 데이터베이스로 보내기 전에 데이터를 올바르게 삭제하고 확인합니다. 예를 들어,
102
응용 프로그램을 통해 값 을 백분율로 저장하는 방법이 없습니다 .응용 프로그램은 데이터베이스에서 오는 모든 데이터가 완벽하게 유효하다고 가정합니다. 즉,
102
백분율로 나오면 어딘가에서 충돌이 발생하거나 사용자에게 그대로 표시되어 이상한 상황이 발생합니다.쿼리의 99 % 이상이 단일 응용 프로그램에서 수행되지만 시간이 지남에 따라 스크립트가 표시되기 시작합니다 (필요할 때 수동으로 실행 된 스크립트 또는 크론 작업). 일부 데이터 작업은 데이터베이스 자체에서 직접 수행됩니다. 스크립트와 수동 SQL 쿼리 모두 유효하지 않은 값을 도입 할 위험이 높습니다.
그리고 여기 내 질문이 온다 :
검사 제한 조건이없고 결과적으로 외래 키가없는 관계형 데이터베이스를 모델링하는 이유는 무엇입니까?
그 가치가 무엇인지,이 질문과 내가받은 답변 (특히 Thomas Kilian과의 흥미로운 토론) 을 통해 데이터베이스 제약 조건에 관한 결론을 내리는 기사 를 작성 했습니다 .