답변:
내가 사용하는 코드 기반의 데이터베이스 마이그레이션 도구 및 소스 제어에서 마이그레이션 코드를 유지한다.
타임 스탬프를 버전 번호로 사용하면 원하는 수의 개발자가 대부분 자유롭게 마이그레이션을 추가 할 수 있으며 모든 데이터베이스 복사본에 대해 자신있게 마이그레이션 도구를 실행할 수 있습니다.
이전 버전에서는 SQL 스크립트를 사용했지만 코드 기반 접근 방식은 하나의 논리적 "스팟"에 있고 단일 명령으로 필요한 모든 스크립트를 실행할 수 있기 때문에 훨씬 쉽게 작업 할 수 있습니다.
버전 관리 및 지속적인 통합에서 스크립트를 빌드하여 확인
나를 위해 일한 한 가지 접근법은 각 개발자가 자신이 좋아하는 것을 할 수있는 자체 스키마로 작업하는 것입니다. 이 스키마는 파괴 가능했으며 모든 개발자가 기여한 버전 제어 스크립트 세트에서 가져온 테스트 데이터로 채워졌습니다.
야간 연속 통합 빌드는 최신 버전의 모든 스크립트를 가져 와서 응집성있는 테스트 데이터베이스를 구축하려고했습니다. 그런 다음 응용 프로그램에 대해 일련의 통합 및 기능 테스트를 실행하여 현재 스키마가 현재 릴리스 후보와 일치하는지 확인합니다.
이 길을 시작하기 전에는 상당히 견고한 데이터베이스 디자인이 있었고 DBA는 개발자가 비정규 화 및 기타 공포에 열중하지 않도록 항상주의를 기울였습니다.
스크립트 변경이 즉시 명백해 졌기 때문에 버전 관리가 크게 도움이되었습니다. 또한 데이터베이스 VERSION
의 전체 상태를 식별하기 위해 데이터베이스 테이블을 사용했습니다. 이것은 간단한 정수 시퀀스였으며 특정 응용 프로그램에 연결되지 않았습니다.
전반적으로 잘 작동했으며 개발자는 다른 계층에 영향을 미치지 않고 항상 자신의 스키마를 롤백 할 수 있기 때문에 지속성 계층을 변경하는 것을 두려워하는 것을 중단했습니다.
schemata 및 기타 SQL 스크립트를 버전 제어 상태로 유지하는 것 외에 다른 유용한 방법은 실제 DB에 '스키마 버전'테이블 을 유지하는 것 입니다.
create table schema_migrations (
`appliedAt` timestamp not null default CURRENT_TIMESTAMP,
`migrationCode` varchar(256) not null,
`extraNotes` varchar(256),
primary key (`migrationCode`)
)
Doctrine에는 http://www.doctrine-project.org/documentation/manual/1_2/en/migrations 와 같은 멋진 마이그레이션 도구가 있습니다. 가장 좋은 점은 자동 생성되거나 손으로 쉽게 코딩 할 수 있다는 것입니다.
내가 사용하는 접근법은 매개 변수에 대한 하나의 테이블을 제공하는 것입니다. 이 테이블에는 데이터베이스가있는 버전에 대한 하나의 이름 / 값 쌍이 있습니다. 이렇게하면 두 가지 이점이 있습니다. 데이터베이스 수정 프로그램이 응용 프로그램을 통해 적용되었는지 확인하는 방법이 있으며 해당 값을 SQL 스크립트에 사용할 수 있습니다.
SQL 스크립트는 새 테이블을 작성하고 열을 변경하며 이전 버전에서 스크립트를 승격시키기 위해 데이터베이스에 필요한 모든 작업을 수행합니다. 이상적으로는 롤백 스크립트가 있지만 대부분은 그렇지 않습니다.
BTW,이 전체 접근 방식은 Ruby on Rails의 일부로 자동화되었으며 롤백 스크립트가 포함되어 있습니다. 나는 그 아이디어를 좋아하지만 모든 프레임 워크가 그런 것은 아닙니다. Ruby on Rails를 사용하지 않을 때는 위에서 설명한 방법을 사용합니다.