2011-10-27 6 views
0

私は、ユーザーの検索条件に従ってデータベースからレコードを取得するWebアプリケーションを設計しています。結果を取得した後、フロー内に別のステージが存在し、結果が追加のデータで「装飾」されます。デザイン:データベースとJavaの両方で同じ論理計算が必要

たとえば、名前、年齢、身長、体重などの列を持つ人物データベーステーブルがあるとします。プログラムは、そのテーブルを特定の論理計算式でフィルタリングすることができる。人の体重のように定義された彼女の「理想体重」、未満のすべての人のレコードを保つ:だから

IDEAL_WEIGHT = (height/100) * age 

、我々はIDEAL_WEIGHT <重量すべてのレコードが表示されますが、これはSQL、ストアドプロシージャなどを用いて達成することができます - 最終行はです。これはSQLでフィルタリングしています。 「結果の装飾」段階に関して、それは、例えば、各結果に対してWEIGHT_PER_INCHを算出

WEIGHT_PER_INCH = height/weight 

として定義されるこれらの「装飾」の計算は、上記よりも多く複雑で、実際に広範であることができることができますリモートホスト上に存在するデータを含むか、または他の計算ユニットに依存する可能性があります。だから、SQLと思われ、おそらくPL/SQLは仕事には適していません。Javaのほうがです。はJavaでで「装飾」しています。

ここでは、IDEAL_WEIGHTによるフィルタリングとWEIGHT_PER_INCHでの装飾を行っていますが、とは逆の方法が必要な場合はどうなりますか?(つまり、WEIGHT_PER_INCHでフィルタリングし、IDEAL_WEIGHTで装飾する)。

これらの計算ユニットはすべて、ストアドSQLプロシージャーまたはJavaクラスのいずれかのタイプである必要があります。しかし、それらがSQLプロシージャーであれば、表現力が十分ではなく、Javaクラスであれば、データベースをすばやく検索するために使用することはできません。

私の質問は:

SQL、例えばからJavaを呼び出すためのきれいな、広く使用されている、高速な方法があります

Select * from Persons p where IDEAL_WEIGHT(p) < p.weight 

ここで、IDEAL_WEIGHT()はJavaメソッドであり、SQLプロシージャではありません。

または:これ以外の方法はありますか?

ありがとうございました。

+0

あなたは特定のDB製品を念頭に置いていますか? –

+0

実際にMySqlを使用していません... – bloodcell

+1

"広く使用されているクリーンな方法で、JavaからSQLを呼び出す方法はありますか?"その答えは "ストアドプロシージャ"です。多くのデータベース(DB2やOracleを含む)では、ストアドプロシージャをjavaで記述することができます。どのデータベースを使用していますか? **編集**:ああ、mysql。私はそれが何をサポートしているかわかりませんが、基準が "無料のデータベース"の場合、PostgreSQLは[PL/Java](http://pljava.projects.postgresql.org/)から入手できるJavaストアドプロシージャを持っています。 – jmelesky

答えて

2

この考え方は一般的に実行できません(MySQLを使用している場合はもっとそうです)。

How to Call Java Code from MySQL?

をどうやらこれは私がで見つかったの参照のみ(任意のさらなる発展を取得できませんでした:あなたがここに見ることができるよう

は、MySQLによるJavaは、直接呼び出し可能にするいくつかの努力がなされてきました確かに大雑把なGoogle検索は2008年からです)。

他のRDBMSでは、Javaを使用してストアドプロシージャを書き込むことを許可しています(または、おそらく許可しています)。オラクルは確かに、誰かがすでにPostgresについて言及しています。 重要なのは、Oracle(組み込みJVMを使用している)の場合でも、いくつかの制限に対処する必要があるということです.Javaライブラリの完全なセットを使用できるストアドプロシージャを書くか、サービスなど

RDBMSは、一貫性のある「理想的な世界」の一種であることをご理解ください。クエリが外部からの事実でフィルタリング(または装飾)されるという考え方は、RDBMSの哲学に反するものであり(クエリエンジンは問合せの実行方法をインテリジェントに選択できないため)、本当に疑問ですこれはどんな有用な方法でも機能します。

+0

それはそれを置く良い方法です:)それで、dbをすばやく検索するこの必要性を満たす方法がありますが、Javaコードでその検索で使用された計算を使用していますか? – bloodcell

+0

あなたの最善の策は、できるだけ制限的であるようにSQLクエリを書いて、結果セットに(クライアント側で)Java計算を適用することです。 SQLの方言で表現できるいくつかのヒューリスティックを考え出し、クライアントに送る前に返される行の数を減らすかどうかを見てください。 –

1

データは静的で確定的ですか? (1)一度エントリ(人の場合)が入力されると、それはユーザーの更新または定期的/自動調整のいずれかによって変化するか、(2)複雑な計算の場合、データXを入力すると、あなたはいつも必然的に結果Yを得ますか?

これらの回答に応じて、データウェアハウスのようなソリューションを検討することをお勧めします。すべての "ベース"データ(年齢、身長、体重)を入力すると、でもが計算され、その結果もデータベースに格納されます。これにより、保存された結果に基づいてクエリをフィルタリングできます。これは、(何らかの理由で)データが取り出されるたびに計算を実行しなければならない場合や、データの変更頻度があまりにも高い場合は非効率的になる可能性があります。

+0

私の考えは正確です。 @bloodcellこれらの値を動的に計算するのはなぜですか? Javaで結果を計算し、入力が変更された場合にのみデータベースに格納する必要があります。 – meagar

+0

値の静的計算が不可能であると仮定してください。計算には多くの構成オプションがあり、すべての構成の事前計算は実行できません。それを超えて - データそのものは動的であり、計算は決定論的です。 – bloodcell

関連する問題