2

データベース スキーマを変更する方法について、DBA と話し合いました。彼の意見は、すべての変化は可逆的でなければならないというものです。例えば:

  • 古くなったテーブル/列は、冗長になったらすぐに削除しないでください。代わりに、少なくともいくつかのリリースのために保持する必要があります。
  • テーブル/列の名前を変更する代わりに、新しいテーブル/列を作成し、内容を古いものから新しいものにコピーします
  • 「foo」という名前のストアド プロシージャ/トリガーを変更する必要がある場合は、元のストアド プロシージャ/トリガーをそのままにして、「foo2」という名前の新しいストアド プロシージャ/トリガーを作成します。もちろん、これはストアド プロシージャ/トリガーへのすべての参照を更新して、新しい名前を参照する必要があることを意味します。

このアプローチの利点は、(たとえば) リリースに失敗し、アプリケーションの以前のバージョンに戻す必要がある場合に、データベースを以前のバージョンに切り替えることができることです。テーブルと列が単純に削除された場合、これは不可能です。

私はこのアプローチの賢明さについて私自身の意見を持っていますが、回答に偏りが生じることを恐れて、当面は自分の意見にとどめておきます. 違いがある場合、環境はソーシャル ネットワーク アプリを開発するスタートアップです。

4

4 に答える 4

4

あなたがどのようなソフトウェア環境にいるかはわかりませんが、企業 (銀行) の仕事から見た私の見解です。

一般的な原則としては、おそらく SQL コードではなくクライアント コードで問題が発生する可能性があり、サーバーを元に戻すことができる必要があります。私はこれが数回起こるのを見てきました。

リリースから数時間後に問題が見つかった場合は、その間に入力されたデータを処理する必要があります。

リリース時に取得したデータベースの複製を新しいデータで更新することはできますが、環境によってはこれが許可されない可能性があります (ただし、これは私が大規模なリリースを行った主な方法です)。

私の経験では、リリースの問題はシステムの小さな部分に影響を与える可能性があり、そのほとんどは問題ないので、小さな部分を回復するためだけにシステム全体をシャットダウンして元に戻すことは望ましくありません。

ただし、変更を元に戻す必要があることを考えると、データベース管理者は少し保守的だと思います。

テーブルと列はある段階で削除する必要がありますが、元に戻すことができるように、後のリリースまで待つことができます

はい、常にデータをコピーします (実際、名前が完全に不適切でない限り、名前を変更しないことをお勧めします。変更を行うリスクは、確実に何らかの利益をもたらします)。列の型を変更する場合は、SQL サーバーと実行内容によって異なります。たとえば、Sybase では、列のサイズを大きくしてもデータは変更されませんが、サイズを小さくすると、データ値が影響を受ける可能性があるため、コピーが必要になります。

ストアド プロシージャとトリガーに関しては、これはコンパイルされたコードのようなものなので、名前を変更せずに上書きするだけです。変更するオブジェクトはデータに依存しないため、すぐに再作成できます。これは、ストアド プロシージャの以前のバージョンをバージョン管理などから簡単に取得できることを前提としていますが (コードがバージョン管理下になく、唯一のバージョンがデータベースにあるデータベースを見たことがあります。コードを上書きしますが、次のリリースの前にコードを制御できます)

于 2009-09-24T15:47:33.363 に答える
1

「廃止されたテーブル/列は、冗長になったらすぐに削除しないでください。代わりに、少なくとも数回のリリースのために保持する必要があります。」

そして、すぐに削除したくない列を管理する制約も保持しますか?

ユーザーが宣言した制約がビジネス ルールの一部ではなくなったために、更新の失敗が発生する可能性があることを意味します。

一貫して「段階的に慎重に段階的に廃止」しようとする人々に、私はある種の共感を覚えます。あなたが言及したすべての例で、そのアプローチがデータベースのコンテキストで有効かどうかはわかりません。

于 2009-09-24T21:59:12.387 に答える
1

常にデータベースのバックアップを作成する必要があることに同意しますが、データベースを無用な情報で汚染するべきではありません。役に立たないコードでコードを汚染したままにしてはならないのと同じです。

データベースのバックアップを作成してから、MOD を作成してください。何か問題が発生した場合は、バックアップに戻してください。

常にデータベースにすべてを保持すると、信じられないほどの肥大化につながります. それだけでなく、いくつかのパフォーマンスの問題に見舞われる可能性があります。そして最も重要なことは、なぜそこにあるのかわからないため、後で誰もそれに触れたくないということです。コードとは異なり、将来、データベースに追加の列などが存在する理由を理解するのははるかに困難です。彼らはそれがレガシーデータ/コードであることを知らないので、それを維持し続けるだけです!

于 2009-09-24T15:54:06.910 に答える
0

これは、DBA が怠惰すぎてバックアップを実行できないように思えます。;)

于 2009-09-24T15:48:55.000 に答える