1

私は非常にデータベース駆動型の Web アプリに取り組んでいます。最初のリリースが近づいているので、このバージョンの機能をロックダウンしましたが、リリース後に他の多くの機能が実装される予定です。これらの機能には、必然的にデータベース モデルの変更が必要になるため、リリースごとにデータベースを移行する複雑さが気になります。私が知りたいのは、リリース前にデータベースに組み込むことができるように、特定の機能を今すぐ予測しようとするのではなく、すぐにリリースできるように、堅実なデータベース設計をロックダウンすることにどの程度関心を持つべきかということです。また、現在のモデルの欠陥を見つけることを期待しており、おそらく変更を加えたいと考えていますが、アプリをリリースしてからデータが入り始めると、データの移行は困難な作業になると思います。この種の問題に取り組むための従来の方法はありますか? 正しい方向へのポイントは非常に役立ちます。

ちょっとした背景として、私は CG 制作パイプライン用のアセット管理システムを開発しています。たくさんのデータがあり、それらの間にたくさんのつながりがあります。これは Web ベースで、完全に Python で記述されており、SQLite エンジンで SQLAlchemy を使用しています。

4

2 に答える 2

2

本番アプリケーションのデータベースを管理するためのいくつかの考慮事項:

  1. 毎晩バックアップを作成します。これは非常に重要です。なぜなら、(データまたはスキーマに対して) 更新を行おうとして失敗した場合、より安定したものに戻せるようにする必要があるからです。

  2. 環境を作成します。開発用のデータベースのローカル コピー、他の人がライブに移行する前に確認およびテストできるステージング データベース、そしてもちろんライブ システムが指す本番データベースのようなものを用意する必要があります。

  3. ローカルで開発を開始する前に、3 つの環境すべてが同期していることを確認してください。このようにして、時間の経過に伴う変化を追跡できます。

  4. スクリプトの作成を開始し、リリース用のバージョンを作成します。これらをソース管理システム (SVN、Git など) に必ず保存してください。何が変更されたかの履歴記録と、特定のリリースで実行する必要があるスクリプトの小さなセットが必要なだけです。整理整頓に役立ちます。

  5. ローカル データベースに変更を加えてテストします。次の 2 つのことを行うスクリプトがあることを確認してください。1) データまたはスキーマを変更するスクリプト、2)問題が発生した場合に行ったことを元に戻すスクリプト。これらをローカルで何度もテストします。スクリプトを実行し、テストしてからロールバックします。まだ大丈夫ですか?

  6. ステージングでスクリプトを実行し、問題がないかどうかを確認します。自分の作業が適切であり、必要に応じて変更を元に戻すことができることを証明するもう 1 つのチャンスです。

  7. ステージングがうまくいき、自信がついたら、本番データベースでスクリプトを実行します。データを変更するスクリプト (更新、削除ステートメント) とスキーマを変更するスクリプト (フィールドの追加、フィールドの名前変更、テーブルの追加) があることを思い出してください。

一般的に、時間をかけて慎重に行動してください。規律があればあるほど、自信がつきます。データベースを更新するのは怖いかもしれないので、急いではいけません。行動計画を書き出して、テスト、テスト、テストしてください。

于 2013-01-16T18:03:42.727 に答える
1

私が見た (そして気に入った) アプローチの 1 つはversions、ID のみを含むという名前のテーブルでした。

次にupdates.sql、次のような構造を持つスクリプトがありました。

DELIMITER $$

CREATE PROCEDURE IF NOT EXISTS DBUpdate()
BEGIN

IF (SELECT id FROM versions) = 1 THEN
  CREATE TABLE IF NOT EXISTS new_feature_table(
     id INT PRIMARY KEY AUTO-INCREMENT,
     blah VARCHAR(128) ...,
  );

IF (SELECT id FROM versions) = 2 THEN
  CREATE TABLE IF NOT EXISTS newer_feature_table(
     id INT PRIMARY KEY AUTO-INCREMENT,
     blah VARCHAR(128) ...,
  );

END$$

DELIMITER ;

CALL PROCEDURE DBUpdate();

次に、Python スクリプトを作成してリポジトリの更新をチェックし、データベースに接続して、この手順でスキーマへの変更を実行します。データベース全体を構築するために適切な id 値を持つテーブルのみが必要なため、これは素晴らしいことですversions(データなし、つまり、データのバックアップに関するryan1234の回答を参照してください)。

于 2013-01-16T18:25:00.273 に答える