2012-04-23 49 views
1

我管理的系统有来自程序,项目,阶段,部门等的许多实体。 公司中的许多人希望他们自己的不同实体的自定义视图。到目前为止,我自己一直在创建自定义视图,但它已经到了我的老板要求我创建查询制造商的地步,以便每个员工都可以随时创建,保存和查看自己的查询。他们应该能够选择他们想要查看的主要数据,然后添加条件以及选择如何显示数据。关于创建“查询生成器”的建议

这是我迄今为止在数据库表中的术语:

查询

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个问题我不知道如何最好的方法。

  1. “值”字段应该是什么类型。我在考虑99%的时间,价值将是一个整数,但显然也会有一个日期或字符串的机会。你会推荐什么样的数据类型?可能不是最好的,但我几乎在想我可以序列化和反序列化的BLOB。使用BLOB,我可以将数组存储在该字段中,这将使我不必存储多行,就像我前面提到的几行一样。

  2. 另一件事是范围。如果他们想要在特定日期之间创建项目会怎样或者,例如,列的值在5-10之间。我想知道这是否可以用一个名为“max_value”的额外列来处理。如果这个列不是NULL,那么我们假设它是一个范围,“值”将是min_value。

  3. 有关模板字段的任何建议。我将使它成为一个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> 
+1

实际上,这就是为什么SQL被发明的主要原因 - 允许非技术人员使用纯英文单词查询数据库。拥有一个只允许使用SELECT语句的Web界面(使用格式化表格作为输出),并且有一些易于使用的指南(从简单到复杂)可能比查询浏览器更容易使用。 – rid 2012-04-23 16:45:40

+0

我也这么想过。但是,我的老板想要一个允许员工创建这些查询的界面,然后将其保存以供将来使用。基本上最终会成为一个列出所有查询名称的页面,并允许用户通过1快速查看每个查询。 查询生成器的用户界面在完成各种向导时已经完成。一步一步,您定义您的查询,设置条件,选择要显示的内容并保存。基本条件在这一点上工作得很好。只是不确定数据库设置。特别是如何处理范围。 – Justin 2012-04-23 16:56:26

回答

1

如果我是建设它,我会让人产生这样的查询:

“选择” 然后有一个下拉的表。

然后一旦填充表,使用information_schema.columns找到该表中的所有列。

然后有一个列表框,您可以添加列,从而构建您的列列表。

最后添加第二个列表框添加列的位置并允许用户键入关联的数据(又名添加StartDate和一个可输入日期的文本框)。

+1

我添加了一些用于生成查询生成器UI的XML数据。根据我的老板,并非所有表格的字段都可以被过滤,所以这是我使用这个XML文件的原因之一。 – Justin 2012-04-23 17:08:53