2016-03-29 15 views
0

SQLのWhere句のデータベース設計を進めています。私のアプリケーションは、エンドユーザーがSQLのwhere句を指定できるようにするワークフローエンジンです。次のように現在、私のアプリケーションは、where句の作成をサポートしています。私はあなたが作成した句を選ぶ選択ドロップダウンをしたいくつかの他のページで「SQL Where句」のテーブル設計を最適化する

<input type="text" name="clause-name" placeholder="condition name here" /> 
 
<br/> 
 
<br/> 
 
<input type="radio" name="where">Complex</input> 
 
<br/> 
 
<div style="display:inline-block"> 
 
    <select> 
 
    <option value="1">ch4 &ge; 1.5</option> 
 
    <option value="2">locality = chino</option> 
 
    <option value="3">postal_code like [0-9]{5}</option> 
 
    <option value="4">date &le; 2015-12-31</option> 
 
    <option value="5">chino and ch4</option> 
 
    <option value="6">postalcode and date</option> 
 
    <option value="7">chino or postalcode</option> 
 
    </select> 
 

 
    <select> 
 
    <option>AND</option> 
 
    <option>OR</option> 
 
    </select> 
 

 
    <select> 
 
    <option value="1">ch4 &ge; 1.5</option> 
 
    <option value="2">locality = chino</option> 
 
    <option value="3">postal_code like [0-9]{5}</option> 
 
    <option value="4">date &le; 2015-12-31</option> 
 
    <option value="5">chino and ch4</option> 
 
    <option value="6">postalcode and date</option> 
 
    <option value="7">chino or postalcode</option> 
 
    </select> 
 
</div> 
 
<br/> 
 
<input type="radio" name="where">Simple</input> 
 
<br/> 
 
<div style="display:inline-block"> 
 
    <select> 
 
    <option>ch4</option> 
 
    <option>locality</option> 
 
    <option>postal_code</option> 
 
    <option>date</option> 
 
    </select> 
 

 
    <select> 
 
    <option>&le;</option> 
 
    <option>&lt;</option> 
 
    <option>&ge;</option> 
 
    <option>&gt;</option> 
 
    <option>&ne;</option> 
 
    <option>=</option> 
 
    <option>like</option> 
 
    </select> 
 

 
    <input type="text" placeholder="value here" /> 
 
</div> 
 
<br/> 
 
<br/> 
 
<button>Create Condition</button>

を。問題は、このシナリオ用に設計したデータベーステーブルです。今以下のようになります:idが主キーであるとcondition1, condition2が自己の外部キーであるように

WhereTable(id, name, feature, op, value, condition1, jointype, condition2)

。次のように条件(ch4 >= 1.5 and locality = chino) or (postal_code like [0-9]{5} and date <= 2015-12-31)のためのサンプルテーブルは次のようになります。

table, th, td{ 
 
    border: 1px solid black; 
 
    }
<table> 
 
    <tr> 
 
    <th>id</th> 
 
    <th>name</th> 
 
    <th>feature</th> 
 
    <th>op</th> 
 
    <th>value</th> 
 
    <th>condition1</th> 
 
    <th>jointype</th> 
 
    <th>condition2</th> 
 
    </tr> 
 
    <tr> 
 
    <td>1</td> 
 
    <td>ch4&ge;1.5</td> 
 
    <td>ch4</td> 
 
    <td>&gt;=</td> 
 
    <td>1.5</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    </tr> 
 
    <tr> 
 
    <td>2</td> 
 
    <td>locality=chino</td> 
 
    <td>locality</td> 
 
    <td>=</td> 
 
    <td>chino</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    </tr> 
 
    <tr> 
 
    <td>3</td> 
 
    <td>postal_code like [0-9]{5}</td> 
 
    <td>postal_code</td> 
 
    <td>like</td> 
 
    <td>[0-9]{5}</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    </tr> 
 
    <tr> 
 
    <td>4</td> 
 
    <td>date&le;2015-12-31</td> 
 
    <td>date</td> 
 
    <td>&lt;=</td> 
 
    <td>2015-12-31</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    </tr> 
 
    <tr> 
 
    <td>5</td> 
 
    <td>chino and ch4</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>1</td> 
 
    <td>and</td> 
 
    <td>2</td> 
 
    </tr> 
 
    <tr> 
 
    <td>6</td> 
 
    <td>postalcode and date</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>3</td> 
 
    <td>and</td> 
 
    <td>4</td> 
 
    </tr> 
 
    <tr> 
 
    <td>7</td> 
 
    <td>chino or postalcode</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>null</td> 
 
    <td>5</td> 
 
    <td>or</td> 
 
    <td>6</td> 
 
    </tr> 
 
</table>

は、私がnull値を減らすために、このテーブルの設計を最適化することができます方法はありますか?私はデータベースサーバーとしてMySQLを使用しています。

+0

あなたはどのテーブルデザインについてお聞きしますか?これはデータベース設計に関するものですが、HTML

を表示します。これは、データベースコンテンツの表現としては珍しいことです。 データベース設計について言えば、これらのnull値は適切なデータベースでは問題にならないはずです。必要な属性を定義し、頻繁に照会される属性にインデックスを設定するだけです。特定の問題がまだある場合は、より具体的にしてください。 – TAM

+0

@TAM - これを調べていただきありがとうございます。テーブル 'WhereTable(id、name、feature、op、value、condition1、jointype、condition2)'について話しています。 htmlテーブルは、値がデータベース内でどのように見えるかを示す単なる図です。問題は、すべての行で、NULLが 'condition1、jointype、condition2'カラムまたは' feature、op、value'カラムに存在することです。私はこれらのヌル値を最小限に抑えるためにデザインを最適化できるかどうかを知りたいのです。 –

答えて

1

ああ、今私は理解していると思う。オブジェクト指向の用語で

、データベースに、このような構造をマッピングするために、今すぐ

Formula 
    int id 
    String name 

BasicFormula extends Formula 
    String variable 
    Operator operator // something like <=, contains, ... 
    String value 

CompoundFormula extends Formula 
    Formula leftFormula 
    Operator operator // and, or 
    Formula rightFormula 

のように継承構造を持つ、異なる戦略があります。両方のスペシャライゼーションの属性を含むテーブルを持つだけで、あなたが提案したクラス階層テーブルを使用することは完全に合法です。詳細な説明はに記載されている。多くの場合、テーブルを1つしか持たないのが最も簡単なソリューションです。もちろん、データベースを照会する人はスキームの解釈方法を知っていなければなりませんが、これは他の戦略にも当てはまります。

+0

オブジェクト指向で表現する方法が好きでしたが、ソリューションのCompoundFormulaクラスの問題は、LeftFormulaとrightFormulaがBasicFormulaまたはCompoundFormulaのいずれかになる可能性があることです。私は、両方のスーパークラスであるので、データ型を数式に変更するとここで助けになると思います。私はこれを実装しようとし、それが動作するかどうかを見てみましょう。ありがとう。 –

+0

それは魅力のように働いた。どうもありがとうございます。私は本当にあなたの助けに感謝します。 –

+0

もちろん、フォーミュラされているはずです。私は答えを編集します。 – TAM