중복 데이터베이스 열에 대해 어떻게 설득력있게 주장 할 수 있습니까?


47

나는 새로운 조직에서 일하기 시작했으며 데이터베이스에서 본 패턴 중 하나는 비즈니스 분석가가 쉽게 쿼리를 작성할 수 있도록 필드를 복제하고 있습니다. 우리는 Django와 ORM을 사용하고 있습니다.

어떤 경우 에는 특정 상황에서 환자를 식별하는 고유 한 문자열 로 MedicalRecordNumber 객체를 유지합니다 . 우리는이 등록 환자를 추적하고 관련이 객체 MedicalRecordNumbers을 , 오히려 외래 키 관계를 사용하는 것보다 그들이 조인 쓰기 방지 (수, 그들은 문자열을 중복 하지 성능상의 이유로)를. 이 패턴은 데이터베이스 전체에서 공통입니다.

저에게있어 데이터 모델이 깨끗하다는 것이 중요합니다. 불필요한 복잡성은 제한된인지 처리 시간의 낭비입니다. 체계적인 문제입니다. 조인을 작성하는 것이 편하지 않다는 것은 수정 가능한 기술 문제입니다. 필자는 돌아가서 스키마를 바꾸는 것을 옹호하고 싶지는 않지만 이러한 유형의 복제와 관련된 문제를 설득력있게 설명하고 싶습니다.


2
"편안한 글쓰기가 편하지 않다"는 것은 무엇을 의미합니까? 그들은 그것을 어떻게 설명합니까?
scriptin

9
이 사람들이 당신을 위해 일합니까? 당신은 그들의 감독자입니까? 대부분의 정당성은 en.wikipedia.org/wiki/Database_normalization 에서 찾을 수 있습니다 . 예, 조인을보다 잘 사용해야합니다.
Robert Harvey

1
정규화가 바람직한 이유에 대한 문헌을 찾아 보셨습니까?
Nathan Tuggy

17
내부적으로 조인을 수행하는 뷰를 추가하여 쿼리 작성을 쉽게 만들지 않습니까? 대안으로 제안 할 수 있습니다.
코드 InChaos

1
동료 및 선배들과이 사실을 (정말로) 대화 했습니까? 그들의 칭의는 무엇이며, 무엇을 고려하고 있습니까? 이것이 좋은 아이디어가 될 수있는 많은 이유가 있습니다 ( "성능이 이유가 아니라고"하더라도 어떤 증거를지지해야합니까?). 너무 게 으르거나 딱딱하다고 비난하기 전에 디자인을 그대로 유지 한 이유를 고려하고 질문 했습니까? 쓰기보다 훨씬 더 많은 읽기가있을 수 있습니까 (분석 량이 많은 DB)? 추적 변경? 과거 데이터? 모두에게 물어보십시오. 누군가 진짜 이유를 알 수 있습니다 .
Luaan

답변:


128

이상 을 줄이려면 운영 데이터베이스를 고도로 표준화해야합니다 .

분석 데이터베이스 (웨어 하우스)는 분석을 쉽게하기 위해 고도로 비정규 화되어야합니다.

별도의 분석 데이터베이스가없는 경우 고도로 표준화되지 않은 [구체화 된]보기를 만들어야합니다.

수석 비즈니스 분석가 / 관리자에게 간단한 분석을 위해 많은 조인을하도록 지시하면 해고 당할 수 있습니다.

민첩한 데이터웨어 하우스 디자인 은 좋은 책입니다

빠른 데이터웨어 하우스 팁을 여기에서 확인하십시오.


9
이것이 올바른 길입니다.
Nit

6
+1 뷰가 정확히 의도 된 것입니다 : 정규화 된 데이터베이스에서 비정규 화 된 뷰를 허용합니다.
Nzall

4
절대적으로 맞지만, "변칙 감소"가 더 강조되어야한다고 생각합니다. 그것이 그 질문에 대한 주요 대답이기 때문입니다. (단지는?) 이상은 데이터 중복으로 볼 수 가장 일반적인 / 비정규은 실제 데이터가 있는지 알 수있는 방법으로 당신을 떠날, 열이 어떻게 든 동시에 모순 된 데이터로 채워 것입니다 생각 없는 것으로하고 무엇이 잘못되었는지 결정하는 방법. 후자는 대규모 변경 추적으로 완화 할 수 있지만, 비용이 많이 들고 빠르게 문제를 찾아 낼 수는 없습니다. 문제를 완전히 피하기 위해 더 비용 효율적입니다.
jpmc26

2
고려해야 할 또 다른 각도는 개발자가 데이터를 올바르게 유지할 수 있다고 가정하더라도 (일관된) 리소스를 많이 소모하여 일관성을 유지하기 위해 모든 중복 필드가 업데이트되도록하는 것입니다.
Nate CK

1
@Panzercrisis 트랜잭션이 "암시 적"인 유일한 방법은 쿼리 끝에서 자동 커밋을 실행하는 것입니다. 일반적으로 프로덕션 데이터베이스의 경우는 아닙니다. 응용 프로그램에서 트랜잭션은 자동으로 시작되고 커밋은 쿼리와 별도로 발행되어야합니다. 이는 애플리케이션에 대한 선불 투자이지만 데이터베이스 호출 추가와 관련된 코드 변경을 단순화하고 개발자가 생각해야하는 양을 줄입니다 (개발 속도 향상, 개발 오류 감소). 이러한 종류의 디자인은 연결 풀링과도 잘 어울립니다.
jpmc26

57

왜 누군가가 선택 에 대한 조인을 작성하지 않으려 고하는지 이해 합니다.

그러나 조인으로 뷰를 한 번 작성 하여 정규화되지 않은 테이블 대신 사용할 수 있습니다.

따라서 정규화의 장점과 간편한 선택의 편의성을 결합합니다.


12
조회수는 친구입니다. 자유롭게 사용하십시오. RDBMS가 지원하는 경우 성능을 위해 구체화 된보기를 사용할 수도 있습니다.
VH-NZZ

13

이미 상향 조정 된 답변은 "중복을 피하는 방법"(조회 사용)을 다루지 만 그 이유는 아닙니다. 기본적으로 열 중복이 쿼리 작성을보다 쉽게하는 문제에 대한 잘못된 솔루션임을 보여줍니다. 그러나 질문은 "왜 그냥 임의의 열을 복제하지 않습니까?" 여전히 서있다.

대답은 "머피의 법칙"때문입니다. 머피의 법칙에 따르면

문제가 생길 수 있습니다.

이 경우, 중복 된 열의 각 행 필드의 내용은 원래 열의 각 해당 행 필드의 내용과 동일해야합니다. 잘못 될 수있는 것은 일부 행 필드의 내용이 원본과 다를 수 있으므로 혼란을 초래할 수 있다는 것입니다. 당신은 당신이 그들이 다를되지 않도록하기 위해 가능한 모든 예방 조치를 취한 것으로 생각하지만, 머피의 법칙은 이후한다고 그들이 할 수있는 다른, 그들은 것 다릅니다. 그리고 혼란 일어날 것입니다.

어떻게 이런 일이 일어날 수 있는지에 대한 예로서, 복제 된 열이 마술로 채워지지 않는다는 사실을 고려하십시오. 누군가는 실제로 원본 테이블에 행이 생성 될 때마다 값을 저장하는 코드를 작성해야하고, 원본이 수정 될 때마다 계속 업데이트하는 코드를 작성해야합니다. 이는 데이터베이스에 데이터를 입력하는 코드에 과도한 부담을 가중한다는 사실을 제외하고는 (어떤 경우에는 특정 상황에서 누군가가 데이터베이스를 쿼리하는 코드보다 훨씬 중요합니다) 이 복제를 수행합니다. 그러면 값이 달라집니다. 또는 트랜잭션을 수행하지 않고 복제를 수행해야한다는 것을 기억할 수 있으므로 드문 결함 조건 하에서는 생략 될 수 있습니다. 하지만이 예제를 작성하는 데 시간을 낭비 할 필요가 없었습니다.잘못 될 수 있다면 그렇게 될 것입니다.


12

좋은 / 나쁜 것이 아니라 트레이드 오프의 관점에서 생각하는 것이 더 생산적입니다. 이들은 쿼리 유용성의 이점을 위해 정규화의 장점 (특히 일관성)을 제거합니다.

극단적으로 데이터가 심각하게 일치하지 않으면 데이터베이스가 쓸모 없게됩니다. 다른 극단적 인 경우, 매일 데이터베이스를 쿼리해야하는 사람들이 신뢰할 수있는 결과를 얻기가 너무 어려운 경우 데이터베이스는 쓸모가 없습니다.

위험과 비용을 줄이기 위해 무엇을 할 수 있습니까?

  • 일관성 검사기 도구를 빌드하고 정기적으로 실행하십시오.
  • 복제 된 데이터를 일관되게 업데이트하는 소프트웨어를 통해 쓰기 액세스를 라우팅합니다.
  • 비즈니스 사람들이 DB 내부가 아닌 정보의 관점에서 생각할 수 있도록 조인을 자동으로 수행하는 뷰를 추가하거나 쿼리 도구를 작성하십시오.

6

비즈니스 분석가의 데이터 표준화에 대한 가장 강력한 주장은 데이터 무결성을 촉진한다는 것입니다. 키 데이터가 한 곳에만 저장되면 (하나의 열, 한 테이블에) 잘못된 업데이트로 인해 데이터가 손상 될 가능성이 훨씬 줄어 듭니다. 데이터 무결성의 중요성에 관심이있을 것이므로 데이터베이스와의 상호 작용 방식을 업데이트하도록 설득하는 것이 좋습니다.

약간 더 어려운 쿼리 방법이 잠재적 인 데이터 손상보다 선호 될 수 있습니다.


6
그의 직원은 모든 데이터가 올바르게 업데이트되고 있는지 확인하기에 충분하다고 주장합니다 (조인에 불편한 경우 전제 조건). 아마도 더 나은 주장은 정규화를 피하면 RDBMS가 제공하는 ACID의 이점을 대부분 잃게된다는 것입니다.
Robert Harvey

4
아마, 그러나 그것은 모두 위험의 문제입니다. 쿼리가 쉬워 지므로 데이터베이스가 손상 될 위험이 있습니까?
Oleksi

1
여기서 악마의 옹호자를 재생하면, 누군가가 업데이트를 손상시키고 데이터를 손상시킬 경우 정규화 여부에 관계없이 문제가 될 수 있습니다. 적어도 데이터베이스에 중복성이 있으면 문제가 발생할 가능성이 높습니다 누군가 부패를 알아 차리고 나중에 고칠 수도 있습니다. (물론, 임시 비정규 화는 가장 신뢰할 수있는 오류 탐지 체계는 아니지만 중복을 통한 오류 검사 의 원칙 은 건전합니다. 즉, 이중 입력 부기 작동 방식입니다.)
Ilmari Karonen

다른 말로 표현하자면 관계 무결성보다는 데이터 무결성에 더 많은 것이 있습니다. 완전히 정규화 된 데이터베이스를 사용하면 누군가 업데이트를 엉망으로 만들더라도 완벽한 관계형 무결성을 유지할 수 있지만 잘못 업데이트 된 데이터는 더 적은 가비지로 만들지 않습니다.
Ilmari Karonen

0

다른 사람들이 위에서 제안한 것에 추가하십시오. 이것은 데이터 거버넌스 문제입니다. 데이터 원칙, 정책 ​​및 명명 규칙을 개발하려면 데이터 설계자 및 데이터 관리자와 관련 이해 관계자와 협력해야합니다.

인내심을 갖고 체계적으로 작업하십시오. 밤새 변화는 일어나지 않을 것입니다.


0

떠나다.

솔직히 말해서, 당신은 정상화, 일관성 및 깎아 지른 게으름으로 인한 미친 벌레와 싸우는 것에 대해 몇 달을 보낸 다음 그만 둘 수 있습니다.

또는 시간을 절약하고 좌절과 지금 종료 할 수 있습니다.

좋은 프로그래머는 게으른 사람들입니다. 고객 및 관리 요구를 이해합니다. 그러나 가장 중요한 것은 잘 설계되고 잘 구현 된 솔루션을 사용하여 문제를 해결하는 것은 개인적으로 엄청난 양의 작업, 노력 및 가장 중요한 고통과 스트레스를 줄여 준다는 것을 이해합니다 .

따라서 우수한 엔지니어링을 이해하고 소중히 여기는 장소에서 일하는 것이 훨씬 나을 것입니다.

행운을 빕니다.


사후 고려 : 아마도 BI / OLAP 도구가 필요할 수도 있습니다 ... http://en.wikipedia.org/wiki/Online_analytical_processing

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