创建“查询构建器”的建议

4
我管理的系统包含很多实体,如程序、项目、阶段、部门等。公司里很多人都希望能够查看这些不同实体的自定义视图。到目前为止,我一直在创建自定义视图,但现在我的老板要求我开发一个查询生成器,使每个员工都能够随时创建、保存和查看自己制作的查询。他们应该可以选择他们想要查看的主要数据,然后添加条件以及选择如何显示数据。
就数据库表而言,下面是我目前的进展: 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。

我不确定如何最好地解决两个问题。

  1. "value"字段应该是什么类型。我认为99%的时间,值将是整数,但显然也会有日期或字符串的机会。您推荐哪种数据类型?也许不是最好的选择,但我几乎认为BLOB可以序列化和反序列化。使用BLOB,我可以在该字段中存储数组,这将使我不必像我在前面几行中提到的那样存储多个行。

  2. 另一件事是范围。如果他们想要在某些日期之间创建项目。或者,例如,列的值在5-10之间。我想知道这是否可以通过添加名为“max_value”的额外列来处理。如果此列不为空,则我们假设它是一个范围,“value”将是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
我也考虑过这个。但是我的老板想要一个界面,允许员工创建这些查询,然后保存以备将来使用。基本上会有一个页面列出所有查询的名称,并允许人们逐个快速查看每个查询。查询构建器的用户界面已经几乎完成了,您可以通过向导一步一步地定义查询、设置条件、选择要显示的内容并保存。基本条件在这一点上运作得非常好。只是不确定数据库设置。特别是如何处理范围。 - Justin
2个回答

1
如果我在构建它,我会像这样创建查询:
"select" 然后为表格创建一个下拉菜单。
一旦填充了表格,就使用information_schema.columns查找该表中的所有列。
然后有一个列表框,您可以将列添加到其中,从而构建您的列列表。
最后添加第二个列表框以添加where列,并允许用户键入相关数据(例如添加StartDate和一个文本框,他们可以在其中输入日期)。

1
我添加了一些用于生成查询构建器UI的XML数据。根据我的老板,表格的并非所有字段都允许进行过滤,这就是我使用此XML文件的原因之一。 - Justin

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接