못생긴 데이터베이스로 뛰어 드는 방법?


26

나는 당신 중 많은 사람들이 추악한 데이터베이스를 다루고 있다고 확신합니다. 알다시피, 전혀 정규화되지 않은 데이터베이스, 가장 사소한 데이터를 얻기 위해 큰 고통스러운 쿼리를 수행 해야하는 데이터베이스, 생산중인 데이터베이스 및 조금 변경할 수없는 데이터베이스 ... , "하나".

내 질문은, 어떻게 처리합니까?

  • 새로운 데이터베이스를 만들려고합니까?
  • 포기하고 내버려 두세요?
  • 어떤 조언을 해줄 수 있습니까?

답변:


29
  • 가장 먼저해야 할 일은 ERD ( Entity-Relationship Diagram )를 만드는 것 입니다. 때로는 명령 줄 도구로 메타 데이터를 간단히 설명 할 수 있지만 시간을 절약하기 위해 다이어그램을 자동으로 생성 할 수있는 도구가 있습니다.

  • 둘째, 각 테이블과 열을 검사하여 저장되는 내용의 의미를 배우십시오.

  • 셋째, 각 관계를 검토하고 테이블이 서로 어떻게 관련되는지 이해해야합니다.

  • 넷째, 사용자 지정 데이터 무결성 적용 또는 계단식 작업을 이해하기 위해 모든 뷰 또는 트리거를 읽습니다.

  • 다섯째, 모든 저장 프로 시저를 읽으십시오. 또한 SQL 액세스 권한이있는 경우이를 읽으십시오.

  • 여섯째, 데이터베이스를 사용하는 응용 프로그램 코드의 일부를 읽습니다. 여기에는 몇 가지 추가 비즈니스 규칙과 데이터 무결성 규칙이 적용됩니다.


업데이트 : 나는 단지 좋은 체크리스트와 함께 흥미로운 기사 " 데이터베이스를 상속 할 때해야 할 9 가지 "를 읽었습니다 .

개요:

  1. 백업
  2. 연구 (위에서 언급 한 스키마 문서 단계)
  3. 이전 개발자와 대화
  4. 버그 데이터베이스
  5. 소스 코드 제어
  6. 사용자 및 / 또는 사업자에게 이야기
  7. 몇 가지 사항을 수정하거나 개선하여 사용자와의 신뢰를 구축하십시오
  8. 개발 환경 만들기
  9. 쓸모없는 물건을 떨어 뜨린다

13

이것이 항상 가능한 것은 아니지만 특정 상황에서 나를 위해 일한 한 가지는 일부 테이블을 뷰로 바꾸는 것입니다. 그런 다음 테이블 아래를 정리하고 경우에 따라 뷰를 처리 할 수 ​​있습니다. 내가 말했듯이 일부 경우에만 작동합니다.


Oracle Materialized Views에서도 도움이 될 수 있습니다.
레이 리펠

9

데이터 사전은 당신의 친구입니다. 또한 Visio의 리버스 엔지니어링 도구를 사용하여 데이터베이스를 리버스 엔지니어링하고 고유 한 다이어그램 집합을 만들어보십시오. 리버스 엔지니어링은 대화식이므로 다이어그램을 작성하므로 데이터 사전을 읽는 것보다 훨씬 더 매력적입니다. 프로세스의 활성이 장점이며이를 수행하는 것이 매우 편안합니다.

내가하는 대부분의 작업은 데이터웨어 하우징에서 이루어지며, 여기서 소스 시스템 데이터베이스 스키마를 파킹하는 것은 핵심 활동의 일부입니다. 나는 많은 경우에 이런 종류의 일을했으며 실제로 잘 작동한다는 것을 알았습니다.

Visio pro는 그다지 비싸지 않으며 Visio 모델링 엔진을 사용하면 여러 다이어그램간에 모델을 공유 할 수 있습니다. 보너스로, 다이어그램에 누락 된 외래 키를 추가 할 수 있으며 시스템에 대한 유용한 문서 세트를 얻을 수 있습니다.


6

Bill Karwin의 아이디어 외에도 사용자와 대화하는 것이 좋습니다. 때때로 사용자는 특히 데이터베이스에서보고하는 경우 데이터베이스의 용도에 대해 약간 알고 있습니다.


6

나는 제안을하는 것 외에는 소프트웨어를 변경하기 위해 많은 것을 할 수없는 벤더의 소프트웨어에 대해 매우 추악한 것을 다루고 있습니다. 나는 항상 물건을 바꾸도록 추진하고 있지만 그것이 통제 할 수 없기 때문에 쓰레기에 갇혀 있습니다.

데이터베이스에는 관계가 없기 때문에 빠르게 사용하기 시작한 것 중 하나는 스키마에 대한 일반적인 이름 쿼리입니다.

--Find Column named like 'blah' in a specific table
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V') AND O.Name like '%TableName%'
ORDER by O.Name

또는

--Find all Columns in DB with name like 'blah'    
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V')
ORDER by O.Name

일부 테이블에는 이름이 잘못 지정된 열이 너무 많고 테이블간에 관계를 형성하는 데 사용할 수있는 항목을 찾기 위해 열이 너무 많습니다.

나는 이것이 질문의 재 설계 부분에 큰 도움이되지 않는다는 것을 알고 있지만 나쁜 스키마를 이해하고 해독하는 데 매우 도움이됩니다.


6

SchemaCrawler 는 추악한 데이터베이스를 쉽게 탐색 할 수있는 몇 가지 기능이있는 데이터베이스 검색 도구입니다. SchemaCrawler에는 "grep"과 같은 기능이있어 정규 표현식을 사용하여 테이블과 열을 검색 할 수 있습니다. 예를 들어, 이름의 일부로 "ACCOUNT"를 사용하여 테이블과 열을 검색 할 수 있으며 어떤 방식 으로든 관련 될 수 있습니다.

SchemaCrawler는 외래 키가없는 경우에도 외래 키 관계를 유추합니다. 일반적인 이름 지정 규칙을 사용하여 "약한 연관"을 찾아서이를 수행합니다. 표는 이름이 일반적으로 복수이지만 열 이름이 아니고 열 이름의 접두어가 _ID 일 수 있습니다. 유추 된 관계를 사용하여 관련 테이블을 찾을 수 있습니다.


5

디자인이 얼마나 추악하고 디자인에 대한 제어력과 디자인과 상호 작용하는 요소에 따라 다릅니다. 나는 현재 직장에서 몇 년 동안 많은 추악한 데이터베이스와 상호 작용해야했으며 여기에 내가 다루는 방법이 있습니다.

직원 데이터

직원 데이터를 보유하는 데이터베이스가 있습니다. 벤더 데이터베이스이므로 제어 할 수 없습니다. (Un?) 다행히도 직접 액세스 할 수 없습니다. 매일 아침 DTS 덤프를받습니다.

내가 관리 할 수 ​​있었던 최선은 모닝 덤프에서 입력을 제거하는 스크립트를 작성하고 (단어 선택은 의도적이었습니다) 더 유용한 형식으로 마이그레이션하고 스크러빙 된 데이터에서 작업하는 것입니다.

내가 그것을 바꿀 수 있다고해도, 아마도 그렇게하지 않을 것입니다-그 방식대로 설정되어있는 다른 많은 프로그램이 있기 때문에 변경을 강요 할 수 없기 때문입니다.

온라인 교육 데이터

이것은 내 자신의 디자인의 혼란이었다. 저를 돕기 위해 멘토없이 대학에서 신선하게 만들었습니다. 저는 한 번에 조금씩 고쳐 왔습니다. 데이터에 액세스하는 유일한 프로그램을 제어하기 때문에 사이트의 일부를 업그레이드 할 때 데이터베이스 구성을 "업그레이드"합니다. 변환 스크립트를 작성하고 복사본에서 활발하게 테스트하여 변경해야 할 모든 사항을 확인할 수 있습니다.

오랜 과정 이었지만 멋지게 나옵니다.

교실 훈련 데이터

파일럿 프로젝트는 3 개의 다른 데이터베이스의 데이터를 통합하고 있으며, 전임자에 의해 약간 다르게 다르게 설계되었습니다.

그것은 또 다른 느린 과정이었습니다. 데이터에 액세스하는 프로그램을 완전히 제어 할 수 있기 때문에 온라인 교육 데이터처럼 조금씩 변경했습니다.

돌이켜 보면 이것은 깨끗하게 시작하기위한 주요 후보 였을 것입니다 ... 뒷 시야는 항상 20/20입니다.

결국 ...

나는 이것이 얼마나 도움이되었는지 알지 못하고 더 자세히 설명 할 수 있습니다 (회사 법률 yada yada 등). 최종 답변은 "It Depends"입니다.


5

따라서 모든 답변을 읽은 후 광산을 제공합니다.

먼저 "마스터 테이블"을 찾은 다음 펜과 종이를 사용하여 다른 테이블과의 관계를 매핑하기 시작합니다. 그 후에 응용 프로그램 코드가 있으면 데이터 흐름에 대한 원시 스케치를 시작합니다.

DB가 어떻게 작동하는지에 대한 멋진 그림을 얻은 후에 물건을 바꿀 곳을 확인하기 시작했습니다. 그게 다야.

이유를 모르겠지만 데이터베이스 모델링 소프트웨어보다 종이를 선호합니다.


5

외부 응용 프로그램에서 사용하기 때문에 데이터베이스 "인터페이스"를 변경할 수 없습니다. 사용중인 데이터베이스 유형 (oracle, mysql, mssql)을 모르지만이 방법 중 하나라고 생각합니다.

  • 뷰 및 저장 프로 시저로 이러한 유형의 개체를 사용하여 데이터베이스 인터페이스 구축
  • 단계별 리팩토링 (정규화, 필드 이름 바꾸기 ...)
  • 클라이언트 애플리케이션 변경 (필요한 경우)

뷰, 저장 프로시 저는 내부 데이터베이스 수정 (변경)을 숨 깁니다.


4

데이터베이스의 구조를 발견하는 것 외에도 데이터 품질 을 보는 것이 중요하다는 것을 알았습니다 . 각 열의 의미를 이해하면 결 측값이 많은 곳을 찾을 수 있습니다. 데이터에 익숙해 짐에 따라 다른 열의 값간에 불일치가있는 위치를 검사 할 수도 있습니다.


4

상호 작용 방법에 따라 다릅니다. 일괄 처리가 허용되는 사용 시나리오의 경우 데이터를보다 친숙한 구조로 일괄 처리하고 그에 대한 작업을 수행하는 것이 비용면에서 가장 효과적이라는 것을 알게되었습니다 (개발 시간 및 클라이언트 비용).


4

문제를 뇌를 감쌀 수있는 문제로 나눌 수 있으면 한 번에 하나씩 공격 할 수 있습니다. 가끔은 모든 버거가되지 않은 하나의 테이블 으로도 일할 수있는 교두보를 줄 수 있습니다. 이런 식으로 "청결 지점"을 확장하여 더 많은 데이터베이스를 덩어리로 포함시킵니다.


4

Visio (Microsoft Office의 일부)가있는 경우 리버스 엔지니어링 기능을 사용해 볼 수 있습니다 . 예쁘지는 않지만 최소한 Rational Rose와 같은 "실제"도구 비용의 일부로 시작합니다.



3

빌은 훌륭한 대답을했습니다. 테스트 사용자로 사용자 인터페이스에 로그인하고 사용자가 데이터로 무엇을하는지 정확하게 이해하려고 노력할 것입니다. 저장된 procs 또는 디자인의 일부 이유를 이해하는 데 도움이됩니다. 데이터의 의미와 용도를 이해하는 것은 데이터베이스를 이해하는 데 중요합니다.

데이터베이스가 비즈니스 기능 또는 주제에 익숙하지 않은 경우 (비행 계획을 수행하고 이전에는 재무 응용 프로그램에서만 작업 한 경우와 같이) 사용자에게 주제에 대한 일부 읽기 자료를 요청하거나 라이브러리로 이동하십시오. 주제에 대한 자신 또는 인터넷 검색. 주의해야 할 법적 또는 규제 문제가 있는지 사용자에게 문의하십시오. 이 주제의 배경 중 일부는 이상한 디자인 선택으로 보이는 것을 설명 할 수 있습니다.


3

만약 그것이 벤더 데이터베이스라면 (그리고 나는 정말로 나쁜 것들을 보았습니다) 당신이 할 수있는 일은 벤더에게 그것에 대해 불평하는 것입니다.

사내 구축 된 응용 프로그램의 경우 일반적으로 개발자에게 약간의 교육이 필요하며 성능이 향상되도록 스키마를 변경하기 시작할 수 있습니다. 시간이 걸리며 일반적으로 속도가 느립니다.

필자의 경험에 따르면 수백 GB 또는 TB의 데이터 이동이 그다지 불가능하기 때문에 새로운 데이터베이스를 구축하는 것은 실제로 선택 사항이 아닙니다.

혼자 남겨 두는 것도 일반적으로 옵션이 아닙니다. 데이터베이스의 데이터 양이 증가함에 따라 성능이 나빠질 것입니다 (문제가 발생할 때마다 부여됩니다). 결국 성능이 나빠 사용자가 응용 프로그램을 사용할 수 없습니다.


3

아 .. 못생긴 데이터베이스, 대기업은 우리가 찾을 더 많은 레거시 데이터베이스입니다.

  • 성능 조정 튜닝 사람들은 성능 문제를 찾을 때까지 이러한 데이터베이스에 대해 불평하지 않습니다. 따라서 조직에서는 개별 쿼리를 식별하여 패치로 미세 조정합니다.
  • 데이터 제한은 이제 비열한 쓰레기의 위치를 ​​알고 있으므로 그러한 데이터베이스를 통한 데이터 흐름을 피하십시오. 준비 데이터베이스를 만들고 데이터를 해당 테이블로 리디렉션하여 이전 데이터베이스를 시작하고 데이터 덤프로 사용하십시오.
  • 데이터 쌓아 두는 피 더 이상 필요하지 않은 아카이브 / 잘라 내기 이전 데이터를. 데이터베이스에 데이터가 필요한 시간을 결정하는 팀이 있어야합니다. 그런 다음 플랫 파일이나 테이프 드라이브로 옮길 수 있습니다.
  • 데이터 리디렉션 및 자르기를 달성 할 수 있으면 단계적으로 제거하십시오 . 다른 팀이 새 데이터베이스를 사용하도록 시작하십시오.

항상 작동하지는 않지만 노력을 기울이지 않으면 악화 될뿐입니다. 응용 프로그램과 함께 데이터베이스를 다시 디자인하려고하면 데이터 마이그레이션으로 더 많은 작업이 추가 될 수 있지만 성능은 항상 모자에서 꺼내는 마술입니다.

못생긴 여자 친구와 행운을 빕니다;)


2

Knowledge Transfer 세션 옵션을 사용할 수 있는지 확인하고 가능하면 최대한 활용하십시오.

또한 많은 DBMS에는 유용한 정보 (예 : 외래 키)를 사용하여 데이터베이스 스키마를 그리거나 인쇄 할 수있는 도구가 제공됩니다.

또한 (NXC에서 도난당한) Visio와 같은 도구를 통해 데이터베이스를 리버스 엔지니어링 할 수 있습니다.


2

쿼리 프로파일 러를 실행하고 프로덕션 시스템에서 어떤 일이 일어나는지 지켜보고 싶습니다. 어떤 테이블이 '핫'하고 어떤 테이블에 대한 쿼리인지 알 수 있습니다.


1

샌드 박스 서버에 백업 사본을 넣은 후 테스트 쿼리 작성 및 실행을 시작하십시오. 나는 복잡한 시스템을 이해하기 쉽고 이해하기가 쉽지만 항상 이해하기 쉽다.

또한 브라우저 창에서 The Daily WTF를 열고 싶습니다 . 다른 사람의 디자인을 인계받는 것은 대개 "나는 그들이 {WTF}를했다고 믿을 수 없다"는 순간을 수반하며 사람들이 당신의 고통을 이해하는 곳으로가는 데 도움이됩니다.

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