我管理的系统有来自程序,项目,阶段,部门等的许多实体。 公司中的许多人希望他们自己的不同实体的自定义视图。到目前为止,我自己一直在创建自定义视图,但它已经到了我的老板要求我创建查询制造商的地步,以便每个员工都可以随时创建,保存和查看自己的查询。他们应该能够选择他们想要查看的主要数据,然后添加条件以及选择如何显示数据。关于创建“查询生成器”的建议
这是我迄今为止在数据库表中的术语:
查询
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)
query_conditions
id
queries_id
field
value
因此,例如,假设一个叫马克创建一个查询/视图,它将显示所有将他作为管理的“项目”呃。会有两个表中的行看起来像这样:
查询:
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 -->
query_conditions:
1
1 (this corresponds to the query id above)
manager
6 (this corresponds to Mark's user id in the system)
我拥有的数据库设计非常简单,易于在简单条件下管理。我已经在想象更先进的条件,您可能想看到任何两位经理或三位或其他人的项目清单。我认为第二个表格的当前设计仍然适用,我只需要为前三列添加相同值的额外行,并为“值”列添加一个不同的值。我可以在开始时进行一次SQL检查,看看我是在处理1-condional还是n条件,在这种情况下,我将不得不在SQL中使用OR。
有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>
实际上,这就是为什么SQL被发明的主要原因 - 允许非技术人员使用纯英文单词查询数据库。拥有一个只允许使用SELECT语句的Web界面(使用格式化表格作为输出),并且有一些易于使用的指南(从简单到复杂)可能比查询浏览器更容易使用。 – rid 2012-04-23 16:45:40
我也这么想过。但是,我的老板想要一个允许员工创建这些查询的界面,然后将其保存以供将来使用。基本上最终会成为一个列出所有查询名称的页面,并允许用户通过1快速查看每个查询。 查询生成器的用户界面在完成各种向导时已经完成。一步一步,您定义您的查询,设置条件,选择要显示的内容并保存。基本条件在这一点上工作得很好。只是不确定数据库设置。特别是如何处理范围。 – Justin 2012-04-23 16:56:26