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

时间:2012-04-23 16:43:22

标签: php sql browser 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

这就是存储在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-condition,我必须在SQL中使用OR。

有两个问题我不确定如何最好地接近。

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

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

  3. 对模板字段的任何建议。我将使它成为一个TEXT字段,只为每行为该自定义查询返回的数据进行解析。

  4. 我认为向您展示我正在使用的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>
    

2 个答案:

答案 0 :(得分:1)

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

“中选择” 然后有桌子下拉。

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

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

最后添加第二个列表框以添加列,并允许用户键入关联数据(也就是添加StartDate和文本框,他们可以键入日期)。

答案 1 :(得分:0)

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