3

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

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

查询

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)

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

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

  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>
4

2 回答 2

1

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

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

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

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

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

于 2012-04-23T16:52:49.400 回答
0

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

于 2012-06-20T10:06:11.420 回答