有关创建“查询生成器”的建议


Advice on creating "Query Builder"

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

这就是我到目前为止在数据库表方面所拥有的:

查询

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

例如,假设一个名叫 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

这就是将存储在文本类型的模板字段中的内容

<!-- 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)

我的数据库设计非常简单,易于管理简单的条件。我已经在想象更高级的条件,您可能希望查看来自任何两个经理或三个经理的项目列表。我认为第二个表的当前设计仍然有效,我只会有一个额外的行,前三列的值相同,"value"列的值不同。我可以在开始时进行 SQL 检查,看看我是否正在处理 1 条件或 n 条件,其中我必须在 SQL 中使用 OR。

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

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

  2. 另一件事是范围。如果他们想要在特定日期之间创建项目怎么办。或者,例如,列的值介于 5-10 之间。我想知道这是否可以用一个名为"max_value"的额外列来处理。如果此列不是 NULL,那么我们假设它是一个范围,"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>

如果我正在构建它,我会像这样创建查询:

"选择"然后有一个表格的下拉菜单。

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

然后有一个列表框,您可以将列添加到其中,从而构建列列表。

最后添加第二个列表框以添加 where 列并允许用户键入关联的数据(也称为添加 StartDate 和他们可以在其中键入日期的文本框)。

我们使用 EasyQuery 组件来完成此类任务。他们有现场演示,您可以免费试用:http://demo.easyquerybuilder.com/asp-net-ajax/