我管理的系统有许多来自程序,项目,阶段,部门等的实体。 公司中的许多人都希望自己对不同实体的自定义视图。到目前为止,我一直在创建自定义视图,但是我的老板已经要求我创建一个查询制作者,这样每个员工都可以随时创建,保存和查看他们自己的查询。他们应该能够选择他们想要查看的主要数据,然后添加条件以及选择如何显示数据。
这就是我目前在数据库表方面所拥有的:
查询
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。
有两个问题我不确定如何最好地接近。
“值”字段应该是什么类型。我想99%的时间,这个值将是一个整数,但显然也有可能有一个日期或字符串。您会推荐哪种数据类型?可能不是最好的,但我几乎在想BLOB,我可以序列化和反序列化。使用BLOB,我可以在该字段中存储数组,这将使我不必存储多行,就像我提到的几行一样。
另一件事是范围。如果他们想要在某些日期之间创建项目怎么办或者,例如,列的值在5-10之间。我想知道是否可以使用名为“max_value”的额外列来处理这个问题。如果此列不是NULL,那么我们假设它是一个范围,“value”将是min_value。
对模板字段的任何建议。我将使它成为一个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>
答案 0 :(得分:1)
如果我正在构建它,我会创建这样的查询:
“中选择” 然后有桌子下拉。
然后填充一次表后,使用information_schema.columns查找该表中的所有列。
然后有一个列表框,您可以添加列,从而构建列列表。
最后添加第二个列表框以添加列,并允许用户键入关联数据(也就是添加StartDate和文本框,他们可以键入日期)。
答案 1 :(得分:0)
我们使用EasyQuery组件来执行此类任务。 他们有现场演示,您可以免费试用:http://demo.easyquerybuilder.com/asp-net-ajax/