我管理的系统有许多来自项目、项目、阶段、部门等的实体。公司中的许多人都希望有自己的不同实体的自定义视图。到目前为止,我一直在自己创建自定义视图,但到了这样的地步,我的老板要求我制作一个查询器,以便每个员工都可以随时创建、保存和查看他们自己制作的查询。他们应该能够选择他们想要查看的主要数据,然后添加条件以及选择如何显示数据。
到目前为止,这是我在数据库表方面所拥有的:
查询
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)
对于简单的条件,我的数据库设计非常简单且易于管理。我已经在想象更高级的条件,您可能希望查看来自任意两位经理或三位经理的项目列表。我认为第二个表的当前设计仍然有效,我只会有一个额外的行,前三列的值相同,而“值”列的值不同。我可以在开始时进行 SQL 检查,看看我处理的是 1 条件还是 n 条件,其中我必须在 SQL 中使用 OR。
有两个问题我不确定如何最好地解决。
“值”字段应该是什么类型。我在想 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>