데이터베이스 무결성 강화


19

외래 키, 검사 제약 조건 등이 아닌 데이터베이스 무결성을 응용 프로그램에 적용하는 것이 합리적입니까?

내부 데이터베이스 도구를 통해 데이터베이스 무결성을 강화하지 않을 것으로 예상되는 성능 향상은 어느 정도입니까?

답변:


24

사실, 데이터베이스에 외래 키 제약 조건이있어 성능이 크게 저하 될뿐만 아니라 성능이 향상됩니다. SQL Server 쿼리 최적화 프로그램은 기본 및 Foriegn 키와 다른 유형의 데이터 제약 조건을 중심으로 구축되었습니다. 이러한 것들이 제 위치에 있고 시행된다면, 옵티마이 저는 더 나은 성능을 얻기 위해 그것들을 활용할 수 있습니다. 다음은 간단한 예제 가 포함 된 블로그 게시물입니다 .

읽기보다 실제로 많은 삽입이있는 경우 (그리고 업데이트 및 삭제에는 읽기가 필요하므로 일반적으로 읽기 수에 추가됩니다) 성능을 위해 데이터에서 제약 조건을 제거하는 것이 좋습니다. . 그러나 압도적 인 대다수의 데이터베이스는 읽기 지향적이므로 성능을 향상시키지 않고 성능을 희생합니다.

그리고 코드에서 모든 작업을 수행하는 것처럼 한 번만 작성하면되므로 데이터베이스에서 데이터 무결성을 더 잘 처리한다는 사실은 언급하지 않습니다. 데이터 액세스 계층을 신중하게 사용하고 모든 앱이 동일한 계층을 통과하도록 db에 액세스해야합니다).

관계형 데이터베이스 시스템을 사용하는 경우 실제로 사용하지 않는 이유는 무엇입니까? 관계형 데이터가 필요하지 않은 경우 Hadoop 또는 다른 것으로 이동하십시오.


2
그것은 내가 생각하고 기대했던 것의 선을 따라 거의 있습니다. 나는 이전 직장의 DBA가 그것에 대해 잘못되었다는 것을 알고 있었고, 그것에 대해 독립적 인 의견을 얻고 싶었습니다. 감사!
Renats Stozkovs

17

많은 응용 프로그램 개발자가 그렇게 생각합니다.

데이터 무결성을 응용 프로그램 코드에 위임하려고 할 때 "지금부터 끝까지이 데이터베이스에 도달하는 모든 프로그래머와 모든 응용 프로그램은 매번 완벽하게 올바르게 처리해야합니다."라고 생각하십시오.

그럴 가능성은 얼마나 될까?


5
+1. 그것은 기본적으로입니다. 잘 테스트 된 중앙 시스템을 수많은 프로그래머가 준수해야하는 교체품으로 교체하십시오. 매번 발생하지 않으므로 시간이 지남에 따라 잘못된 데이터가있는 데이터베이스가 생성됩니다.
TomTom 2012

13

성능 향상이 있더라도 참조 무결성 및 일반화 된 데이터 무결성의 반환에 비해 무시할 수 있습니다.

데이터베이스가 멍청한 데이터 저장소 인 시절은 오래 전입니다. RDBMS가 제공하는 강력한 기능을 활용하십시오.

성능 향상이 모든 것, 특히 이와 같은 소규모가 아닙니다. 그러나 응용 프로그램에서 적용해야 할 외래 키 관계가 있고 참조 테이블의 기본 키가 아닌 것으로 밝혀지면 성능 향상에 거의 관심이 없습니다 (있는 경우) 그 세부 사항에 대해서는 이야기하지 마십시오).


-1. 사람들이 애플리케이션 로직을 데이터베이스에 집어 넣는 시대는 지났습니다. 전체 스택의 일부를 확장하는 데 가장 어렵고 비용이 많이 듭니다. SAID : 참조 무결성은 데이터베이스 수준의 무결성에 관한 것으로 매우 유용합니다.
TomTom 2012

5
@TomTom 응용 프로그램에서 데이터 무결성 논리를 다시 작성하면 RDBMS에서 이미 수행 된 작업이 다시 실행됩니다. 데이터베이스에 데이터 로직을 유지하십시오.
토마스 스트링거

@TomTom- "이론적으로 유효하지 않은 데이터 shuold는 데이터베이스에 절대 도달하지 않지만 무결성은 마지막 방어선입니다." 동의했다. 이 멋진 AJAX 양식은 입력을 사전 검증하여 최종 사용자에게 많은 두통을 덜어줍니다. 마찬가지로, 이러한 데이터베이스 제약 조건으로 인해 잘못된 코드로 인해 정리 작업 에 소요되는 시간, 비용 및 에너지를 최대한 절약 할 수 있습니다 .
Nick Chammas

6

충분히 큰 데이터로드를 수행하는 경우 제약 조건 (외부 키, CHECK 등) 및 인덱스를 삭제하고 이후에 제약 조건 및 인덱스를 다시 활성화 / 구현하는 것이 일반적입니다. 그 검증에는 시간 비용이 있습니다. 그것은 데이터베이스 특정 벌크로드 구문을 사용할 수 없다고 가정합니다 (로깅 최소화 포함).

각기 다른 상황 (데이터 유형, 디자인 등)이 고유 할 것으로 예상되는 성능 향상의 정도를 말하는 것은 불가능합니다. 진정으로 아는 유일한 방법은 테스트하는 것입니다.


1
+1. 일반적으로 데이터로드는 처리를 수행하지 않고 데이터가 올바르다 고 가정하고 인덱스 재 작성 단계에서 실패합니다. 이는 데이터웨어 하우저 수준의 기술입니다.
TomTom 2012

3

제약 조건이 방해되는 경우가 몇 가지 있습니다.

  1. 단일 테이블 상속 (STI) 을 사용해야하는 경우 개인과 조직 모두에게 판매한다고 가정하십시오. 행이 개인이거나 조직인 단일 "파티"테이블이 필요합니다. STI는 널이 아니어야하는 널 입력 가능 필드가 필요함을 의미합니다. 클래스 테이블 상속이이 문제를 해결하지만 일부 ORM의 경우 더 어렵습니다. 예를 들어 Ruby의 ActiveRecord는 STI 만 지원합니다.

  2. 엔터티의 초안 버전을 지원해야하는 경우에는 완전히 유효하지 않을 수 있습니다. 초안을 json으로 저장할 수 있지만 클라이언트에서 동일한 식별자를 재사용하기가 더 어렵습니다. id = 5로 저장되었고 유효하지 않은 것으로 편집되어 draftid = 99로 자동 저장되었다고 가정하십시오. 이 경우 모든 필드가 널 입력 가능해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.