0

SQL の Where 句のデータベース設計に取り組んでいます。私のアプリケーションは、エンド ユーザーが SQL の where 句を指定できるようにするワークフロー エンジンです。現在、私のアプリケーションは次のように 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>

他のページには、作成した句を選択する選択ドロップダウンがあります。問題は、このシナリオ用に設計したデータベース テーブルです。現在は以下のとおりです。

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

それidは主キーでありcondition1, 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 を使用しています。

4

1 に答える 1

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

さて、このような構造をデータベースにマッピングするには、さまざまな戦略があります。両方の特殊化の属性を含むテーブルを持つだけで、あなたが提案したクラス階層ごとのテーブルを使用することは完全に合法です。詳細な説明はhttps://docs.jboss.org/hibernate/orm/3.5/reference/en/html/inheritance.htmlにあります。多くの場合、テーブルを 1 つだけにするのが最も簡単な解決策です。もちろん、データベースにクエリを実行する人は、スキームを解釈する方法を知っている必要がありますが、これは他の戦略にも当てはまります。

于 2016-03-29T18:45:20.323 に答える