3

데이터베이스 리팩토링에 관심이 있습니다. 나는 많은 양의 데이터가없는 몇 개의 데이터베이스를 다루는데, 최대 몇 십만 개의 행이있는 단지 몇 GB에 불과하다. 그러나 테이블, 뷰, sproc 및 기능이 수백 개 (때로는 수백 개) 있습니다. 어떤 곳에서는 스키마를 사용하는 분할 및 규칙 전략이 구현되어 테이블의 소유권/사용법을 확인하는 데 몇 가지 문제가 발생했습니다. 그러나 실제로 객체 결합에 도움이되지는 못합니다.데이터베이스에있는 테이블/sprocs/함수의 개수가 너무 많습니다.

우리 모두는 integration via shared database이 좋지는 않지만, 적어도 잠시 동안 모든 것이 데이터베이스에 있으므로 매우 생산적이라는 것도 알고 있습니다. 객체와 마찬가지로 데이터베이스에 Single Responsibility Principle을 적용하지 않습니다.

편집 : 데이터베이스 성능 문제가 없음을 추가해야합니다. 테이블은 크지 않고, 최대 테이블은 수십만 행에 불과합니다. 실제 데이터베이스 성능 문제는 없습니다. 데이터베이스 스키마/로직/구현이 기묘하게 비효율적 일 때 (보고서의 데이터를 사전 처리하기 위해 결과 집합의 각 행에 대해 sproc 실행을 수행해야한다고 가정 할 때를 제외하고). 당신이 내가 이것을 바꿔야한다고 말하기 전에 요점이 있습니다. 그것은 데이터베이스가 더 이상 변화의 영향을 평가할 수있는 상태가 아니기 때문에 가능하지 않습니다.

분명히 어떤 시점에서 "충분히!"라고 말하면됩니다. 메시지, ETL, 응용 프로그램 계층 등으로 연결된 여러 데이터베이스로 나누십시오.

질문 : 얼마나 많은 것이 너무 많습니까? 당신이 미쳐 가기 전에 가질 수있는 sprocs/tables/functions의 수의 절대적인 상한선은 무엇입니까?

답변

0

내가 언급 한 것들 중 하나에 대한 마법의 한계가있는 것은 아닙니다. 나는 한 곳에서 일을 유지하는 것을 선호하므로 일부 기록이 제자리에 있고 다른 기록이 다른 기록에 있다는 것을 기억할 필요가 없습니다.

이 모든 작업이 실적에 영향을 주는지 알고 싶습니다. 그리고 그렇지 않다면 왜 그것을 바꾸어야합니까? 어떤 끔찍한 방식으로 실적에 영향을 미치지 않는다면 고객은 자신의 업무에서 얻은 이점을 보지 못할 것이며 그다음에 무엇이 요점입니까?

방금 ​​새 컴퓨터를 구입하거나 데이터베이스 서버 소프트웨어를 업그레이드 한 고객이 더 나은 서비스를 제공 할 수 있습니다.

+0

내가 데이터베이스 측면에서 성능 문제가 없습니다. 내가 직면하는 유일한 문제는 기술적 빚이다. 데이터베이스는 복잡 할뿐만 아니라 더 이상 적합하지 않은 많은 필드가 있습니다. –

1

먼저 개체 지향 용어로 데이터베이스를 생각하려고 시도하지 마십시오. 객체 지향 프로그래밍의 원리는 단순히 관계형 데이터베이스에는 적용되지 않습니다.

공유 데이터베이스는 비즈니스 관점에서 볼 때 매우 유용합니다. 그들 사이에 전송되어야하는 정보를 저장하는 다중 데이터베이스는 신속하게 수많은 복잡한 객체보다 훨씬 복잡해집니다. 엔터프라이즈 응용 프로그램간에 일관된 데이터는 매우 귀중합니다. GE Corp와 General Electric Corporation이 실제로 두 데이터베이스간에 동일한 엔티티 인 경우 조정을 시도하면 악몽이 될 수 있습니다.

리팩토링 데이터베이스는 좋은 목표이지만 실제로는 매우 복잡합니다. 해결해야 할 주요 성능 문제가 있거나 변경의 영향을받을 수있는 모든 코드를 식별하는 프로세스를 기꺼이 수행하지 않는 한 그렇게하지 마십시오. 그렇다면 변경 될 수있는 모든 코드를 알 수 있는지 고려하십시오 (데이터베이스 사용자가 동적 코드를 싫어하거나 싫어하거나 증오하는 이유 중 하나입니다).

종종 리펙토링하는 가장 좋은 방법은 변경 사항을 추가하고 새 필드 인 sp 등을 사용하여 이전 된 설정 만료 날짜까지 기존 코드를 그대로 두는 것입니다. 귀하는 연례주기에 있기 때문에 장기간에 걸쳐 해당 날짜를 관리해야합니다.sp가 사용 중인지 확인하려면 확실하지 않은 코드를 식별하고 실행할 때마다 테이블에 삽입 할 코드를 추가 할 수 있습니다. 1 년 내내 일을 끝내고 도망 간다면 안전하게 제거 할 수 있습니다. 사이클은 sp에 따라 더 짧을 수 있습니다.

나는 매년 만 운영 될 무언가를 쓰고 있는데, 나는 일반적으로 sp라는 단어를 annual에 넣을 것이다. 그러나 그것은 당신이 어디에 있든 그렇지 않을 수도 있습니다. 그러나 sp의 기능은 주기적으로 만 실행해야하는 것이라면 아이디어를 제공해야합니다. usp_send 이메일 proc이 일년에 한 번만 실행되기를 기대하지는 않지만 usp_attendance_report가 자주 실행되지 않을 수도 있습니다. 물론 내가 말했듯이, 나는 usp_annual_attendance_report와 같은 이름을 지었을 것입니다. 그리고 당신은 앞으로 나아갈 그런 종류의 일을 고려할 수 있습니다.

하지만 리팩터링을 수행하면 필요한 항목을 삭제하지 않도록 긴 주기로 수행해야합니다. 코드가 소스 제어 시스템에 있으면 (그리고 모든 데이터베이스 테이블, sp, 뷰, UDF, 트리거 등이 있어야 함), 실패 할 경우 즉각 다시 되돌릴 수 있다는 것을 알면 어떤 것을 제거 할 수 있습니다. 다시 말하지만, 개체를 조사하여 위험 요소를 제거 할 가능성을 판단했습니다.

물론 자동 테스트가 잘되어 있다면 dev에서 무언가를 제거하고 테스트를 실행하면 어떤 것이 아직 참조되고 있는지 확인할 수 있습니다.

쉬운 방법으로 리팩토링을 찾고 계시다면, 나는 하나도 모르겠습니다. 리팩터링 데이터베이스는 시간이 오래 걸리는 위험한 활동이며 비용을 지불 할 능력이있는 사람들에게는 충분한 개선이되지 않을 수도 있습니다. 리팩토링 데이터베이스에

좋은 책은 다음과 같습니다 http://www.amazon.com/Refactoring-Databases-Evolutionary-Addison-Wesley-Signature/dp/0321293533

+0

데이터베이스 리팩터링에 대한 책을 읽었습니다. 프로덕션 데이터베이스에서 일반적인 통증 수준에 대한 지침을 찾고있었습니다. 나는 이제까지 약간을 보았다. 그리고 그들은 모두 고통스럽게 보인다, 나는 단지 얼마나 아프게 괴로운지에 관해 궁금하게 생각하고 있었다. –

+0

보통 꽤 고통 스럽습니다. 그러나 잘 정리되어 있고 신중하게 작업하고 단계별로 모든 데이터 액세스가 동적 쿼리가 아니라 저장된 procs를 통해 제어되는 경우 수행 할 수 있습니다. ORM 액세스도 가능하지만 경험이없는 것으로 알고 있습니다. 하나의 핵심은 필요하다면 모든 것을 롤백하기 쉽도록하고 테스트 테스트를 테스트하는 것입니다. 또한 데이터베이스를 정말 잘 알기위한 대체 방법이 없습니다. 소규모로 시작하여 중요한 것은 아니라고 확신하는 것들을 사용하여 리팩토링을위한 시스템을 마련하십시오. 그런 다음 가장 큰 문제 영역을 수행하십시오. – HLGEM

관련 문제