2009-07-27 7 views
3

メインデータベースにテーブルを作成する必要があるアプリケーションがあるとします(アプリケーションが初めて実行されるなど)。これを行うにはどのような方法がより柔軟でスケーラブルで、商用製品に適していますか?データベース構造の作成と編集のためのアプローチ:コードまたはスクリプト?

私はそれをすべてコード化すれば、追加のファイル(スクリプト)は必要ありません。ユーザーはそれらと愚かなことをすることができず、アプリケーションが動作しないと不平を言う。しかし、何かがdb構造で変更されるときは、私はパッチの部分をコード化しなければならず、ユーザは新しいバイナリをインストールする必要があります(または古いものを置き換える)。

スクリプトソリューションは、いくつかのディレクトリやスクリプトからすべてのスクリプトを実行するためのコードです。バイナリは同じで、自動的にパッチが適用されます。しかし、ある時点で新しいスクリプトもユーザーに配布する必要があります。

だから、あなたは何をお勧めしますか?

アプリケーションはC#でコード化されます。データベースは現在SQLServer 2005の下にありますが、今後変更される可能性があります。もちろん、描画アプリケーションとデータベース処理部分は、2つのバイナリ/アセンブリに分けることができますが、私のコード対スクリプトのジレンマは解決しません。

答えて

2

チェックWizardby:それはあなたのデータベーススキーマへの変更を表現するために(SQL DDLにやや近い)特殊な言語を提供しています。

migration "Blog" revision => 1: 
    type-aliases: 
     type-alias N type => String, length => 200, nullable => false, default => "" 

    defaults: 
     default-primary-key ID type => Int32, nullable => false, identity => true 

    version 20090226100407: 
     add table Author: /* Primary Key is added automatically */ 
      FirstName type => N /* “add” can be omitted */ 
      LastName type => N 
      EmailAddress type => N, unique => true /* "unique => true" will create UQ_EmailAddress index */ 
      Login type => N, unique => true 
      Password type => Binary, length => 64, nullable => true 

      index UQ_LoginEmailAddress unique => true, columns => [[Login, asc], EmailAddress] 

     add table Tag: 
      Name type => N 

     add table Blog: 
      Name type => N 
      Description type => String, nullable => false 

     add table BlogPost: 
      Title type => N 
      Slug type => N 
      BlogID references => Blog /* Column type is inferred automatically */ 
      AuthorID: 
       reference pk-table => Author 

これらversionブロックは基本的には、データベーススキーマに適用したい変更されます。

Wizardbyをビルドプロセスとアプリケーションに統合することもできます。起動時には、データベースを最新のバージョンにアップグレードできます。したがって、アプリケーションは常に最新のスキーマバージョンで動作します。

セットアッププロセスに統合することもできます。WizardbyはSQLスクリプトを生成してデータベーススキーマを変更することができ、セットアッププロセスの一部として実行できます。

+0

これはスクリプトの代わりにコードの投票ですか? SMOなどを使ってこのような仕組みを書くことができて面白そうです。 – grapkulec

0

通常、インストールコードをアプリケーションコードとは別にしておきたいと思います。あなたは間違いなくあなたのアプリケーションが実行する前にそれが必要な適切な構造を持っていることを確認するために、データベースに対してバージョンチェックのいくつかの並べ替えを実行するでしょう。私は続くだろう基本的な設定はこれです:各リリース バージョンと

  1. 使用スクリプトが 展開データベースにスキーマ変更を行うこと。

  2. は データベースの現在のバージョン、スクリプトは がそれに対して実行されている追跡し、おそらく簡単なバージョン テーブルを追跡するためのデータベースで何かを持っています。 の方が毎回スキーマを確認するために よりバージョンスクリプトを探して、 テーブルとフィールドをすべて検索してください。 が必要です。

  3. がアプリケーションのバージョンを満たしていることをアプリケーションに確認してください。 ユーザーに、 データベースをデータベーススクリプトで更新する必要があることを知らせるエラーを記録します。

これは、アプリケーションコードをきれいに保つが、データベースとアプリケーションが同期していることを確認する必要があります。

+0

"最後に適用されたバージョン"はデータベースに保存されていたと思ったが、なぜスクリプトがコード化されないのか?私はdbのバージョンを確認し、スクリプトを実行するだけでなくパッチコードを実行することができます。アプリケーションv4が新しいテーブルを使用する場合、私はそのテーブルをデータベースに追加する必要がありますが、コードではなくスクリプトによってなぜですか? – grapkulec

+0

最初に述べたように、私の個人的な好みは、インストールコードを自分のアプリケーションコードから遠ざけることです。これは、コードからスクリプトを実行したり、コードを変更してアプリケーションのビジネス層に配置したりすることで、スクリプトを実行することはできません。 リリーススクリプトではなくコードを使用してDBを変更する場合は、データベースが必要なバージョンに正しくアップグレードされるように、常に別のバージョン管理アプリケーションを作成することができます。これにより、2つのアプリケーションの概念が分離され、スクリプトを使用する必要はありません。 –

0

DBGhostまたはDVCのようなバージョニングツールを使用すると、データベースの更新を維持するのに役立ち、アプリケーションにシームレスに収まるように変更できます。

関連する問題