2012-02-27 11 views
1

多くの人が共有する多数のSQLスクリプトを作成しています。これらのスクリプトは通常、スクリプトを特定の目的のためにわずかに編集し、その後変更されたスクリプトを使用してさらに分析するためのデータセットを生成します。大規模な分析指向のSQLスクリプトライブラリの設計パターン?

私はそのようなライブラリを構築し、整理する最善の方法に苦労しました。私は "signups_and_spend_by_week.sql"のようなファイルの長いリストを持つ単なるフォルダよりも構造が必要です。基本的に2つの相互関連の問題があります。

  • パラメータ化。日付とサンプルサイズのようなものは、比較的簡単に引き出して変数を作ることができますが、クエリの性質を変えるパラメータはどうでしょうか?たとえば、左結合を内結合に変更するとしますか? (b)2つのバージョンを作成して(ひいては深刻なDRY問題を引き起こす)、あるいは(c)これらの種類をより簡単に表現できる高位言語のプログラミング言語でクエリをラップすることは賢明ですか?たとえば、

    q = "SELECT * FROM plants" 
        if want_all: 
         q = _q + "LEFT JOIN fruits ON fruits.plant_id = plants.id" 
        else: 
         q = _q + "INNER JOIN fruit ON fruits.plant_id = plants.id"  
    
        run_query(q) 
    
  • DRYなどです。私は同じパターンが絶えず現れており、より複雑なクエリの中間的なステップとして作成された類似または同一のビューを見つけることができます。私の考えは、これらの再利用可能なビットを分割し、必要に応じて呼び出すことです。しかし、私が心配しているのは、これがライブラリ全体に依存関係を作成し、 "基本"クエリに対する一見無害な変更が、誤って他の人のクエリを破る可能性があるということです。訓練だけでなく、適切な文書/ルール以外にも、自動化されたテストなどの妥協が可能ですか?

答えて

1

純粋に技術的な方法では処理しないでください。

基本的に、他の人が洗練できるSQLベースを提供します。 いくつかの基本SQLにはバグがあり、特定の状況では遅く実行され、存在しない問題が解決され、改善され、変更され、無視され、賞賛されます。

あなたとあなたの同僚に最適なものを予見するのは難しいです。少なくとも私は考えがありません。

私はあなたが最初に非常に基本的な、非常に簡単:SQLスクリプトを持つディレクトリで、ファイルを意味のある名前を与えることをお勧めします。 - 人々がそれらを見て、使用し、変更し、それらから派生し、それらにコメントし、その有用性についてのポイントを与えることを許可する。 - すべての関係者と頻繁に会合する。 - 何がうまくいくのか、あなたのグループが必要とするもの、何がうまくいかないのかを調べてみてください。 - あなたがグループとしてあなたに何をサポートするために必要なツールを明確に見始めるとき思考を開始し、あなたのニーズをサポートするシステムを設計する。データベースがまだ理にかなっている場合は、そのスクリプトをデータベースに保存してください。

今は設計を開始しないでください。おそらく80%を捨ててしまいます.20%を保つことは、あまりにも多くの時間を費やしていた人の気持ちを助けて、グループ。

これは実際にはSCRUMのアプローチが最も効果的な状況です。これは、誰にとっても最適なビルド方法を明確に把握できない状況です。コミュニケーション、問題に対処しようとする短いスプリント、インタラクティブ性、計画どおりにはうまくいかなかったことを変えよう...これらは私にはこのプロジェクトのキーワードやフレーズのようです。

それが成長するように、あなたは今それがどのようになるのかと推測できません。

(これは、あなたのプロジェクトがどのように進化するかは私には分かりますが、これを書いています。あなたはそれがどのように見えるかを明確に把握しています。 )

0

マイ少数の考え:

別のアプリケーションで:

-tags for scripts marking 
-search functionality (Google like) 
-scripts verifications (with metadata) 
-script runner with GUI for parameters entry 

スクリプト:すべてと、

SQLを超えるいくつかのメタ言語は必須ですが、まだそれは、DSLになります欠点。だから私はミニマリズムの精神であなたのDSLを構築しようとします。私の推薦は、DSLの邪魔にならないスタイルです。コメントのすべてのメタ情報、コントロールステートメントもそうです。

/* 
%%Parameters: 
    %%StartDate:Date:Please enter date for blah blah blah 
    %%EndDate:Date:And enter date for blah blah blah 

%%Verions: 
    %%AllProducts:Defalt 
    %%Friuts:Optional 
*/ 

SELECT * FROM plants 

--%%Version:AllProducts 
    LEFT JOIN fruits ON fruits.plant_id = plants.id 
--%%EndOfVersion 

--%%Version:Fruits 
-- INNER JOIN fruit ON fruits.plant_id = plants.id 
--%%EndOfVersion 

WHERE 
    StartDate >= %%StartDate AND 
    EndDate <= %%EndDate 

DRY:このような何かそれは非常に主観的だが、私はメカニズムをincuding、添字ためのインフラストラクチャを構築することではないでしょうrecomentなどIMO利益よりもコストがあります。

関連する問題