"처벌"개발자 또는 자동으로 수정 하시겠습니까? 트리거 대 제약 조건

StackOverflow https://stackoverflow.com/questions/613682

문제

항상 대문자에 있어야하는 데이터베이스 열이 있다고 가정 해 봅시다.

다음은 몇 가지 아이디어입니다.

1) 열 제약 조건을 만듭니다. col = UPPER(col)

2) 전 삽입/업데이트 행 트리거를 설정합니다. col = UPPER(col)

일반적으로 데이터베이스 데이터에 대한 제약이 많을수록 더 좋으며 트리거는 신비 롭고 나쁠 수 있습니다. 개발자가 코드를 쓰는 사람이 동일한 조직에 있으므로 작성된 코드는 당사가 수정할 수 있다고 가정합니다.

어떤 접근법을 사용하고 그 이유는 무엇입니까?

문제의 데이터가 실제로는 항상 대문자이기 때문에 대문자 여야합니다 (원래 여러 타사에 의해 인쇄되어 있습니다). 이 특정 필드의 대문자와 소문자에는 의미가 없습니다.

도움이 되었습니까?

해결책

칼럼이 왜 대문자에 있어야하는지에 따라 다르지만 일반적으로 제약 조건으로 갈 것입니다.

데이터베이스에 데이터를 삽입 할 때 데이터를 변경하는 것은 마음에 들지 않습니다. 그것은 내가 쓴 내용과 다음에 읽을 내용 사이에 불일치가 있다는 것을 의미합니다.

사용자가 텍스트를 입력 한 경우 어퍼 케이스 버전이 포함 된 추가 열을 추가하십시오. 이렇게하면 항상 사용자가 입력 한 텍스트를 표시합니다.

다른 팁

대부분의 상황에서 나는 (1) 말할 것입니다. 그러나 문자열 케이스 감도를 다룰 때, 나는 그것을 특별한 경우로 취급하고 항상 길을 따라 모든 단계에서 그것을 고치는 경향이 있습니다. 나는 그렇게 할 구체적인 이유가 있는지 잘 모르겠다. 단지 "느낌". 아마도 대부분의 환경에서 나는 적어도 비즈니스 논리 관점에서 일했기 때문일 것입니다. FoO 항상 동일합니다 foo 항상 동일합니다 FOO.

또한이 경우 개발자가 "FYI, 모든 문자열은 서버의 대문자에 저장됩니다"라고 말하는 것은 잊어 버릴 때마다 손목을 때리는 것보다 부담이 적습니다. "FYI, DB에 가격을 삽입 할 때마다 판매 세가 추가됩니다."

이것은 제약 조건으로 가장 잘 구현되며 추가로드를 피하고 원하는 것을 수행합니다. 데이터를 필요한 형식으로 강제합니다.

무결성 손실없이 변환 될 수있는 데이터는 데이터베이스 계층에서 처리해야하기 때문에 데이터베이스에서 전환을 강제로 전환하는 것이 잘못된 접근법이라고 생각합니다. 케이스가 무의미한 경우 그렇게 처리하면 제약이 오류를 잡는 데 도움이됩니다.

케이스 insensitive index 추가 더 나은 솔루션 일 수 있습니다 (참조. 데이터베이스 케이스 insensitive index)

또는 자동 테스트의 적용 범위를 늘리고 생산 서버의 추가 부하를 피하십시오.

개발자가 저장된 프로 시저 (또는 무엇이든)로 값을 전달할 수있는 "테이블 API"를 제공하는 또 다른 접근법도 고려하여 값이 삽입의 대문자임을 보장합니다. 나는 이것을 제약으로 뒷받침하고 (한 가지에 대한 쿼리 최적화에 도움이 될 수 있음) 테이블에서 직접 변경 권한을 제거 할 것입니다. 개발자가 대문자를 신뢰하지 않으면 모든 삽입물을 신뢰하지 않으면 신뢰해서는 안됩니다. 항상 tapi를 사용하십시오.

데이터베이스 악의에서 열 제약 조건에서 무언가를 할 수 있다면 트리거가 일반적으로 더 빠르기 때문에 선호됩니다. 응용 프로그램을 통해 시행에 대해 이야기하고 있다면 권장하지 않습니다. 규칙이 항상 적용되어야하는 경우 데이터베이스를 제외한 어느 곳에도있어서는 안됩니다. 코드를 작성하는 응용 프로그램 이외의 사항은 데이터베이스의 데이터를 변경할 수 있습니다. 데이터 무결성은 TEH 데이터베이스의 책임이며, 문제를 피하기위한 코드를 유지하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top