以XML格式存储二维表(决策表)以实现高效查询

时间:2009-02-10 23:40:31

标签: java xml

我需要实现一个路由表,其中有许多参数。

例如,我在下面的传入消息中陈述了五个属性

Customer Txn Group Txn Type Sender Priority  Target
UTI       CORP     ONEOFF   ABC    LOW       TRG1
UTI       GOV      ONEOFF   ABC    LOW       TRG2

在XML中表示此数据的最佳方式是什么,以便可以有效地查询。

我想将这些数据存储在XML中并使用Java我会将其加载到内存中,当收到消息时,我想根据属性识别目标。

感谢任何输入。

谢谢, Manglu

5 个答案:

答案 0 :(得分:3)

这是一个纯XML表示,可以非常有效地处理,而无需转换为任何其他内部数据结构:

<table>
 <record Customer="UTI" Txn-Group="CORP" 
      Txn-Type="ONEOFF" Sender="ABC1" 
      Priority="LOW"  Target="TRG1"/>

 <record Customer="UTI" Txn-Group="Gov" 
      Txn-Type="ONEOFF" Sender="ABC2" 
      Priority="LOW"  Target="TRG2"/>


</table>

使用<xsl:key>指令和XSLT key()函数以这种格式查询数据的方法非常有效:

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:key name="kRec" match="record"
  use="concat(@Customer,'+',@Sender)"/>

    <xsl:template match="/">
      <xsl:copy-of select="key('kRec', 'UTI+ABC2')"/>
    </xsl:template>
</xsl:stylesheet>

应用于上述XML文档时会产生所需的结果

<record Customer="UTI" 
        Txn-Group="Gov" Txn-Type="ONEOFF" 
        Sender="ABC2" Priority="LOW" 
        Target="TRG2"/>

请注意以下

  1. 可以有多个<xsl:key>已定义,用于标识记录,使用不同的值组合将其连接在一起(无论将被视为“密钥”和/或“主要”键“)。

  2. 如果定义<xsl:key>使用“主键”串联,则当key()函数为时,将找到唯一记录(或无记录)评价。

  3. 如果定义<xsl:key>使用“非主键”的串联,则在评估key()函数时可能会找到多条记录

  4. <xsl:key>指令相当于在数据库中定义索引。这使得使用key()函数非常有效

  5. 在很多情况下,没有必要将上述XML表单转换为中间数据结构,原因不在于可理解性和效率原因。

答案 1 :(得分:2)

如果你将它加载到内存中,那么XML所采用的形式并不重要 - 我建议,最简单的方法是手动阅读或写入。当您将其加载到内存中时,然后您应该将其转换为适当的数据结构。 (数据结构的确切性质取决于要求的确切性质。)

编辑:这是为了反驳Dimitre在评论中提出的论点:

我不确定你是否认为我建议人们实施他们自己的哈希表 - 我当然不是。只需为要用作键的每列保留一个直接哈希表或MultiMap。开发人员知道如何使用哈希表。

至于运行时效率,您认为哪种效率更高:

  • 你构建了一些XSLT(并记住这个外国领域,至少相对而言,对于大多数开发者而言)
  • XSLT引擎解析它。如果您使用的XSLT库允许您只对现有查询进行参数化,则可以避免此步骤 。即便如此,你还有一些额外的工作要做。
  • XSLT引擎点击哈希表(至少你希望)并返回一个节点
  • 您将节点转换为更有用的数据结构

或者:

  • 您可以根据您获得的密钥在哈希表中查找相应的条目,直接找到有用的数据结构

我想我个人相信第二个人。在这里使用XSLT感觉就像用螺丝刀砸钉子一样......

答案 2 :(得分:0)

这取决于什么是重复,什么可能是空的。 XML因其高效的可查询性而闻名,因为它既不是固定长度也不是紧凑的。

答案 3 :(得分:0)

我同意前两张海报 - 在查询消息时,绝对不应该将这些数据的内部表示保留在XML中。

XML表示可以是任何东西,您可以这样做:

<routes>
  <route customer="UTI" txn-group="CORP" txn-type="ONEOFF" .../>
  ...
  </routes>

我的内部表示取决于所传入信息的格式和语言。一个简单的表示形式是一个映射,将数据结构(即做出路由决策的关键字段)映射到目标路由上的信息。

根据您的性能要求,您可以将键/目标信息保存为字符串,但在任何高性能系统中,您可能希望进行直接内存比较(在C / C ++中)或某种形式的整数比较。 / p>

答案 4 :(得分:0)

是的,你的基本问题是你在同一句话中使用“XML”和“高效”。

编辑:不,说真的,你杀了我。事实上,这个线程中的几个人正在使用“高效”来描述任何来处理数据格式上的操作,这些数据格式需要字符串解析才能找到你的字段在哪里显示了这个中的几个人线程甚至不知道“有效”这个词是什么意思。尽可能多地向我倾诉。我可以接受,教练。