私が管理しているシステムには、プログラム、プロジェクト、ステージ、部門などからの多くのエンティティがあります。社内の多くの人が、さまざまなエンティティの独自のカスタム ビューを望んでいます。今までカスタム ビューを自分で作成していましたが、各従業員が自分で作成したクエリをいつでも作成、保存、表示できるように、上司からクエリ メーカーを作成するように依頼されるようになりました。表示したい主なデータを選択し、条件を追加したり、データの表示方法を選択したりできる必要があります。
これは、データベーステーブルに関してこれまでのところ私が持っているものです:
クエリ
id
name
desc
isglobal (1 or 0 value, whether the query can be seen by everyone else)
creator (id of user in system)
created (datetime)
entity (this would be the table name or a key which maps to the table name)
template (a template of tags that will be parsed to generate the HTML for that query page)
クエリ条件
id
queries_id
field
value
たとえば、Mark という名前の人がクエリ/ビューを作成し、そこで彼がマネージャーとしているすべての「プロジェクト」を表示するとします。両方のテーブルに次のような行があります。
クエリ:
1
All projects managed by Mark
Shows all projects in the system currently managed by Mark
1
6
2012-04-23 00:00:00
project
これは、TEXT タイプのテンプレート フィールドに格納されるものです。
<!-- BEGIN: ROW -->
<tr>
<td>{PROJECT_NAME}</td>
<td>{PROJECT_DESCRIPTION}</td>
</tr>
<!-- END: ROW -->
クエリ条件:
1
1 (this corresponds to the query id above)
manager
6 (this corresponds to Mark's user id in the system)
私が持っているデータベース設計は非常に単純で、単純な条件の管理が簡単です。私はすでに、任意の 2 人または 3 人のマネージャーからのプロジェクトのリストを表示したい、より高度な条件を想像しています。2 番目のテーブルの現在のデザインは、最初の 3 つの列に同じ値を持ち、「値」列に異なる値を持つ追加の行がある場合でも機能すると思います。最初に SQL チェックを実行して、SQL で OR を使用する必要がある 1 条件または n 条件を扱っているかどうかを確認できます。
どのようにアプローチするのが最善か分からない2つの問題があります。
「値」フィールドの型。99% の確率で値は整数になると考えていますが、明らかに日付や文字列の可能性もあります。どのデータ型をお勧めしますか? おそらく最高ではありませんが、シリアライズとアンシリアライズが可能な BLOB をほとんど考えていました。BLOB を使用すると、そのフィールドに配列を格納できます。これにより、数行上で述べたように、複数の行を格納する必要がなくなります。
もう一つは範囲です。特定の日付の間に作成されたプロジェクトが必要な場合はどうでしょうか。または、たとえば、列の値が 5 ~ 10 の場合。これは、「max_value」という追加の列で処理できないのでしょうか。この列が NULL でない場合は、範囲であると見なされ、「値」が min_value になります。
テンプレート フィールドに関するアドバイス。そのカスタム クエリに対して返されたデータの行ごとに解析される TEXT フィールドにします。
私が使用している XML ファイルをお見せできると便利だと思いました。私の上司は、これらのカスタム クエリを作成するためにテーブルのすべてのフィールドを表示することを望んでいないため、次の XML データを使用して、どのフィールドを "許可" するかをフィルター処理します。
<?xml version="1.0"?>
<entities>
<entity>
<key>program</key>
<table>program</table>
<label>Programs</label>
<allowed>1</allowed>
<fields>
<field>
<key>name</key>
<column>prg_name</column>
<label>Name</label>
<tag>{PROGRAM_NAME}</tag>
<method>getName</method>
<allowed>0</allowed>
</field>
<field>
<key>description</key>
<column>prg_desc</column>
<label>Description</label>
<tag>{PROGRAM_DESCRIPTION}</tag>
<method>getDesc</method>
<allowed>0</allowed>
</field>
</fields>
</entity>
<entity>
<key>project</key>
<table>product</table>
<label>Projects</label>
<allowed>1</allowed>
<fields>
<field>
<key>name</key>
<column>prd_name</column>
<label>Name</label>
<tag>{PROJECT_NAME}</tag>
<method>getName</method>
<allowed>0</allowed>
</field>
<field>
<key>description</key>
<column>prd_desc</column>
<label>Description</label>
<tag>{PROJECT_DESCRIPTION}</tag>
<method>getDesc</method>
<allowed>0</allowed>
</field>
<field>
<key>manager</key>
<column>prd_manager</column>
<label>Manager</label>
<tag>{PROJECT_MANAGER}</tag>
<method>getManager</method>
<allowed>1</allowed>
</field>
<field>
<key>activity</key>
<column>prd_activity</column>
<label>Activity</label>
<tag>{PROJECT_ACTIVITY}</tag>
<method>getActivity</method>
<allowed>1</allowed>
</field>
</fields>
</entity>
</entities>