2010-12-27 19 views
3

私は、MySQLデータベースを照会し、ユーザーに要求されたデータを提示するフロントエンドWebアプリケーションを持っています。データベースには25個のテーブルがあります。テーブルに関連する外部キーがあります。ここでの問題は、ユーザーがSQLを完全に新しくしたことです。私は彼らがテーブルに加わることを期待できません。perlを使用したsql joinの自動化

自動的に結合を生成するスクリプトを作成したいと思います。私はこの作業をより簡単にするためにPerlで利用可能なモジュールがあるかどうか知りたいですか?

私のSQLでの経験はほんの数ヶ月です。あなたの意見をお知らせください。

+0

GUIを使用すると、エンドユーザーはSQLに書き込むことができますか? – Ronnis

+2

リトルボビーテーブル:) – DVK

+1

GUIはユーザーがSQLクエリを実行することができますが、GUIはほとんどのものを抽象化し、ユーザーはコンボボックスを使って条件を書いているだけです... – SAN

答えて

0

私の最善のアドバイスは、フロントエンドアプリケーションを介してユーザー入力を解析し、それを使用してPerl DBIのクエリを解析することです。

+0

ありがとう、私の質問はどのように私は選択したテーブルに自動的に参加することができますです。例:私は2つのテーブル "table1" "table2"を持っていると言うと、それらはtable1.book_idx = table2.book_idxで関連していると言います。ユーザーがtable1とtable2からデータを選択するたびに、ユーザーはtable1.book_idx = table2.book_idxという条件を使用してテーブルに参加しません。私のスクリプトは自動的にそれを行う必要があります。それは私がすべてのテーブルのペアの間の関係を事前に定義することによってそれを解決することができるようですが、より多くのテーブルからのデータが選択されているときに問題になります。 – SAN

+0

はい、ブルートフォースをスクリプトにエンコードすることはおそらく最適ではありません。ただし、任意の2つのテーブルについて、キー列が共通の唯一の列であれば、単純に自然結合を行うことができます。または、他のすべてが失敗した場合は、選択したすべてのテーブルを取り、選択したすべてのテーブルのペア間の関係(共通の列名または外部キーの観点から)を見つけ出し、そのように結合を解析するスクリプトを含めることができます。つまり、PostgreSQLでは '\ d [table_name]'に相当するMySQLを実行し、カラム名を取得し、キー制約を解析します。 –

2

私はそれを総称してモジュールを認識していませんし、モジュールを作成することは非常に重要ではありません。問題は、プライマリ/外部キーが一致するマッピング(常に同じ名前であるとは限りません)、NULL値(内部結合または外部結合)を処理する方法、テーブルの完全なセットが完全に結合可能であることを保証する方法まであります。

また、少なくともSybaseについては(MySQLについてはわからない)、これを自動的に行うための最適化の角度がありますが、これは正しいデータを取得しても簡単なことではありません。

は完全に正直に言うと、私が代わりに何をするのかだろう次

  • まず第一には、テーブル、列、主キーと外部キー、を含む構成(に記録するデータ定義を強制、内部/外部結合までの結合性)。

  • "メイン"テーブルと "エンリッチメント"テーブルを分割します。

    エンリッチメントテーブルは、プライマリキーをメインテーブルの一部に結合して、メインテーブルから取得した各ローにさらにカラムを追加するための唯一の目的を持つテーブルです(私は、人生をよりシンプルにするための結合を除いて、これらのテーブルの句はどこにもありません)。一例として、概念ライブラリ・データベースを考えてみる。 "レビュー"テーブルは "豊かな"テーブルになります - 照会するのではなく、書籍の情報を豊かにするためにそこのデータだけを使用します。 「顧客情報」テーブルは、(特定のビジネス用途のために)「エンリッチメントテーブル」であり、他のテーブルの顧客名に顧客名/住所を単に加入させるだけである。

  • メインテーブルの場合、ユーザーにクエリを作成させるのを忘れないでください。ビジネスシナリオまで実行したいと思うかもしれないすべての単一のクエリを列挙するだけです(ほとんどの可能な結合は意味をなさない/実行する必要はありません)。各シナリオについて、選択しているもののユーザフレンドリーな記述を非常に明確にし、そのシナリオのメインテーブルに対する最適化されたクエリを作成します。さらに、それらの缶詰めクエリのそれぞれについて、そのクエリで選択されたFOREIGNキーのリストを構築します。これは、ユーザーが豊富化テーブルから豊かになるのに役立つかもしれません。 (たとえば、あるクエリで「patron_id」フィールドが選択されている場合は、追加のデータとして「顧客」を追加します)

  • 次に、GUIのユーザーが特定のユースケースシナリオを選択できるようにします。そのシナリオに合った缶詰のクエリを探します。次に、可能な富化オプションを表示します(利用者の住所?y/n?を含む)。これらの追加の豊富な結合を事前に準備したクエリに追加するのはかなり簡単です。

関連する問題