我非常感谢以下问题的一些帮助/指示。
数据库版本:Oracle 9i
Java版本:1.4.2
我有一个数据库表,其中有多列代表有关文档的各种元数据。
E.g:
CREATE TABLE mytable
(
document_id integer,
filename varchar(255),
added_date date,
created_by varchar(32),
....
)
由于网络服务器和数据库服务器之间存在网络/延迟问题,我希望尽量减少对数据库的查询次数。
文档列在网页中,但有数千种不同的文档。
为了帮助导航,我们在网页上提供过滤器以仅选择与特定值匹配的文档 - 例如由用户'joe bloggs'创建或在'01 -01-2011'创建。此外,提供了分页,因此触发db调用以获取接下来的50个文档或其他内容。
网页本身保持相当愚蠢 - 它们只呈现java servlet返回的内容。目前,通过对每列上的不同值进行单独查询,为每个过滤器提供了不同的值。
这需要相当长的时间,因为网络延迟和它意味着5个额外的查询。
我想知道是否有办法在一个查询中获取相同的信息?
例如,有没有办法通过以下形式从该表中获取不同的结果:
DistinctValue Type
01-01-2011 added_date
01-02-2011 added_date
01-03-2011 added_date
Joe Bloggs created_by
AN Other created_by
.... ...
我猜测上面的一个问题是各列的数据类型不同,因此日期和变量不能同时在“DistinctValue”列中返回。
这个问题有更好/标准的方法吗?
非常感谢提前。
杰
正如我在下面的评论中提到的,我想到了一种可能更多的内存/负载有效方法,它消除了加入查询的原始要求 -
我想其他可行的方法是 而不是填充下拉列表 最初,让他们对用户做出反应 打字,然后有一个“建议者” 风格下拉出现的只是那些 与输入匹配的不同值 文本。我认为这意味着a) 保持单独的查询 不同的值,但b)只运行 根据需要单独查询, c)减少结果集 过滤上的唯一值 用户的文字。
答案 0 :(得分:4)
此查询将返回上面描述的输出:
SELECT DocumentID As DocumentID, 'FileName' As AttributeType, FileName As DistinctValue
FROM TableName
UNION
SELECT DocumentID, 'Added Date', Added_date FROM TableName
UNION
SELECT DocumentID, 'Created By', created_by FROM TableName
UNION
....
如果您有权使用此SQL创建视图,则可以将其用于查询。
答案 1 :(得分:0)
由于网络/延迟问题 在网络服务器和数据库之间 服务器,我想尽量减少 查询的数量 数据库中。
文档列在网页中 页面,但有成千上万 不同的文件。
您可能需要查看Lucene。每当我看到“最小化对db的查询”并结合“搜索文档”时,这就是我的想法。我已经非常成功地使用了它,并且可以用于只读或更新环境。 Oracle的答案是Oracle Text,但是(无论如何)对于设置和使用它来说有点熊。取决于贵公司的技术资源和优势。
无论如何,对于每个连接,确实胜过数据库的多个查询。