web-dev-qa-db-ja.com

テーブル駆動式のデータベースに式を保存する最良の方法は何ですか?

ですから、長期的に持続可能なものにするために、コードをテーブル駆動の数式システムに変更しています。

したがって、基本的には5つの外部キーがあり、使用する単一の数式を取得できます。ただし、数式をどのように保存すればよいかはよくわかりません。現時点では、char(100)を使用して、検索時にJavaで解析しています。これは危険なようですが。

私の数式は非常に単純です(.9 * inputBoxA)が、この方法で行うと悪い気分になります。これには標準がありますか、それともプッシュする必要がありますか?

編集:私の状況をもう少し説明させてください。ユーザー入力に基づいた5つの外部キーがあります。もう1つの入力は、ユーザーが指定するレートです。したがって、5つのFKに基づいて、このレートの計算を行います。

数式は通常(inputRate)、(。9 * inputRate)などになりますが、少し複雑になる可能性があります(.9 *(。6 * inputRate-.1))が、それほど悪くはありません。

JPAクエリを使用してデータベースから数式を取得し、Javaで処理するため、ユーザーが数式を直接見ることはありません。ただし、将来的には新しい数式が必要になる可能性があるため、いくつか必要です他の人が入力できるようにするための標準。

3
Locke

それは意見の問題です。後置表記(àla [〜#〜] rpn [〜#〜] 、または スタック指向プログラミング言語 )、または バイトコード (式に固有)を使用できます言語)、またはよりコンパクトな表現が必要な場合は、 s-expr 構文。 [〜#〜] json [〜#〜] はおそらくコンパクトなテキスト表現ですが、非常に広く使用されています(JSONを解析するための多くのライブラリーがあります)。 [〜#〜] ast [〜#〜] sという式のJSON形式を定義できます。

数式の圧縮形式をデータベースに保存することもできます。

たとえば、既存のインタープリターのバイトコードを使用することを検討する場合があります。 LuaGuile2 、またはいくつかの [〜#〜] jvm [〜#〜] 独自の クラスローダーを備えたクラス など...

また、式ではなく、 closures を格納したい場合もあります。

アプリケーション内にインタープリターを組み込むことができます。

プログラミング言語の詳細を学ぶ必要があります(たとえば、Scottの本を読みます: Programming Language Pragmatics )、コンパイラー( ドラゴンの本を読みます )& 解析 &インタープリター& セマンティクス ; スキーム またはLISPを少しでも知っている場合(そして [〜#〜] sicp [〜#〜] を通じてそれを学ぶことはあなたの時間の損失ではありません)私は強くクインネックの本 LISP In小さなピース 、解釈とコンパイルのテクニックの広い視野を提供します。

MathML は、数学、特に数式(XMLを使用)を表すための標準です。ただし、コンパクトではなく、解析も簡単ではないため、式を表現するには多分やり過ぎです。

OpenDocument は、スプレッドシートおよびワードプロセッシングドキュメントの標準であるため、式の表記が含まれています(MathMLに関連しているようです)。

いくつかのDBMS( sqlite からPostgresQL、MongoDB、MariaDB/MySQL)を使用して、数式を(TEXTまたは BLOB として)保存できます。数百万または数十億個を格納できます(たとえば、SQL TABLEに数式を1行ずつ含めます)。

永続データの形式と、その中の「式」や「クロージャ」の形式をdocumentすることを忘れないでください。上級ユーザーでも、その形式を理解し、リバースエンジニアリングを行うことなく他の方法で使用する必要があります。

おそらく、 ビジネスルール管理システム または エキスパートシステム[〜#〜] clips [〜#〜][〜#〜] jess [〜 #〜] )またはいくつかの スクリプト言語 (それから、おそらくあなた自身のものを発明するのではなく、既存のものを使用してみてください)または スプレッドシート ...

ドキュメントで数式の構文を十分に定義してを記述している場合(例: [〜#〜]を使用して、数式をテキストとして保存することにはリスクがありません。 ebnf [〜#〜]およびそれらのセマンティクス(たとえば、 動作セマンティクス );そのドキュメントを公開します(上級ユーザーはそれらについて知る必要があります)。短い数式を効率的に解析することは実際の問題ではありません(ディスクI/Oまたはデータベースアクセスは、数式の解析以上のボトルネックになる可能性があります)。単純な 再帰的降下パーサー または を使用できます。式文法の解析 。式の評価はより困難です(そして、意味論といくつかの 評価戦略 が必要です)。変数とその バインディングを処理するには、いくつかの環境が必要です高次抽象構文 についても読んでください。保存する前に式を検証することを忘れないでください。

メタプログラミング アプローチを取り、これらの形式をルーチン(またはメソッド、クラスなど)または実行可能な何かに変換することもできます...