我管理的系统包含很多实体,如程序、项目、阶段、部门等。公司里很多人都希望能够查看这些不同实体的自定义视图。到目前为止,我一直在创建自定义视图,但现在我的老板要求我开发一个查询生成器,使每个员工都能够随时创建、保存和查看自己制作的查询。他们应该可以选择他们想要查看的主要数据,然后添加条件以及选择如何显示数据。
就数据库表而言,下面是我目前的进展: queries
因此,例如,假设名为Mark的人创建了一个查询/视图,它将显示所有由他管理的“项目”。两个表中都将有一行看起来像这样的内容:
这是存储在类型为TEXT的模板字段中的内容。
我拥有的数据库设计非常直观且易于管理简单条件。我已经想象到了更高级的情况,您可能希望查看来自任何两个或三个经理的项目列表等。我认为第二张表的当前设计仍然有效,其中我将只有一个额外行具有第一列的相同值,以及"value"列的不同值。我可以在开头进行SQL检查,以查看我是否正在处理1个条件或n个条件,在后者中我必须在SQL中使用OR。
就数据库表而言,下面是我目前的进展: queries
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)
我拥有的数据库设计非常直观且易于管理简单条件。我已经想象到了更高级的情况,您可能希望查看来自任何两个或三个经理的项目列表等。我认为第二张表的当前设计仍然有效,其中我将只有一个额外行具有第一列的相同值,以及"value"列的不同值。我可以在开头进行SQL检查,以查看我是否正在处理1个条件或n个条件,在后者中我必须在SQL中使用OR。
我不确定如何最好地解决两个问题。
"value"字段应该是什么类型。我认为99%的时间,值将是整数,但显然也会有日期或字符串的机会。您推荐哪种数据类型?也许不是最好的选择,但我几乎认为BLOB可以序列化和反序列化。使用BLOB,我可以在该字段中存储数组,这将使我不必像我在前面几行中提到的那样存储多个行。
另一件事是范围。如果他们想要在某些日期之间创建项目。或者,例如,列的值在5-10之间。我想知道这是否可以通过添加名为“max_value”的额外列来处理。如果此列不为空,则我们假设它是一个范围,“value”将是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>
SELECT
查询(输出格式化表格)的Web界面,并提供一些易于遵循的指南(从非常简单到更复杂),可能比查询浏览器更容易使用。 - rid