외래 키, 검사 제약 조건 등이 아닌 데이터베이스 무결성을 응용 프로그램에 적용하는 것이 합리적입니까?
내부 데이터베이스 도구를 통해 데이터베이스 무결성을 강화하지 않을 것으로 예상되는 성능 향상은 어느 정도입니까?
외래 키, 검사 제약 조건 등이 아닌 데이터베이스 무결성을 응용 프로그램에 적용하는 것이 합리적입니까?
내부 데이터베이스 도구를 통해 데이터베이스 무결성을 강화하지 않을 것으로 예상되는 성능 향상은 어느 정도입니까?
답변:
사실, 데이터베이스에 외래 키 제약 조건이있어 성능이 크게 저하 될뿐만 아니라 성능이 향상됩니다. SQL Server 쿼리 최적화 프로그램은 기본 및 Foriegn 키와 다른 유형의 데이터 제약 조건을 중심으로 구축되었습니다. 이러한 것들이 제 위치에 있고 시행된다면, 옵티마이 저는 더 나은 성능을 얻기 위해 그것들을 활용할 수 있습니다. 다음은 간단한 예제 가 포함 된 블로그 게시물입니다 .
읽기보다 실제로 많은 삽입이있는 경우 (그리고 업데이트 및 삭제에는 읽기가 필요하므로 일반적으로 읽기 수에 추가됩니다) 성능을 위해 데이터에서 제약 조건을 제거하는 것이 좋습니다. . 그러나 압도적 인 대다수의 데이터베이스는 읽기 지향적이므로 성능을 향상시키지 않고 성능을 희생합니다.
그리고 코드에서 모든 작업을 수행하는 것처럼 한 번만 작성하면되므로 데이터베이스에서 데이터 무결성을 더 잘 처리한다는 사실은 언급하지 않습니다. 데이터 액세스 계층을 신중하게 사용하고 모든 앱이 동일한 계층을 통과하도록 db에 액세스해야합니다).
관계형 데이터베이스 시스템을 사용하는 경우 실제로 사용하지 않는 이유는 무엇입니까? 관계형 데이터가 필요하지 않은 경우 Hadoop 또는 다른 것으로 이동하십시오.
많은 응용 프로그램 개발자가 그렇게 생각합니다.
데이터 무결성을 응용 프로그램 코드에 위임하려고 할 때 "지금부터 끝까지이 데이터베이스에 도달하는 모든 프로그래머와 모든 응용 프로그램은 매번 완벽하게 올바르게 처리해야합니다."라고 생각하십시오.
그럴 가능성은 얼마나 될까?
성능 향상이 있더라도 참조 무결성 및 일반화 된 데이터 무결성의 반환에 비해 무시할 수 있습니다.
데이터베이스가 멍청한 데이터 저장소 인 시절은 오래 전입니다. RDBMS가 제공하는 강력한 기능을 활용하십시오.
성능 향상이 모든 것, 특히 이와 같은 소규모가 아닙니다. 그러나 응용 프로그램에서 적용해야 할 외래 키 관계가 있고 참조 테이블의 기본 키가 아닌 것으로 밝혀지면 성능 향상에 거의 관심이 없습니다 (있는 경우) 그 세부 사항에 대해서는 이야기하지 마십시오).
충분히 큰 데이터로드를 수행하는 경우 제약 조건 (외부 키, CHECK 등) 및 인덱스를 삭제하고 이후에 제약 조건 및 인덱스를 다시 활성화 / 구현하는 것이 일반적입니다. 그 검증에는 시간 비용이 있습니다. 그것은 데이터베이스 특정 벌크로드 구문을 사용할 수 없다고 가정합니다 (로깅 최소화 포함).
각기 다른 상황 (데이터 유형, 디자인 등)이 고유 할 것으로 예상되는 성능 향상의 정도를 말하는 것은 불가능합니다. 진정으로 아는 유일한 방법은 테스트하는 것입니다.
제약 조건이 방해되는 경우가 몇 가지 있습니다.
단일 테이블 상속 (STI) 을 사용해야하는 경우 개인과 조직 모두에게 판매한다고 가정하십시오. 행이 개인이거나 조직인 단일 "파티"테이블이 필요합니다. STI는 널이 아니어야하는 널 입력 가능 필드가 필요함을 의미합니다. 클래스 테이블 상속이이 문제를 해결하지만 일부 ORM의 경우 더 어렵습니다. 예를 들어 Ruby의 ActiveRecord는 STI 만 지원합니다.
엔터티의 초안 버전을 지원해야하는 경우에는 완전히 유효하지 않을 수 있습니다. 초안을 json으로 저장할 수 있지만 클라이언트에서 동일한 식별자를 재사용하기가 더 어렵습니다. id = 5로 저장되었고 유효하지 않은 것으로 편집되어 draftid = 99로 자동 저장되었다고 가정하십시오. 이 경우 모든 필드가 널 입력 가능해야합니다.