我正在设计一个系统,允许通过立法来搜索相关条款,我在寻找存储数据的最佳方式方面遇到了一些困难。以下是标准:
有关立法是一个树状结构。每个法案都包含章节,章节可以有任何深度的小节(例如Act1:2.1.a.c)。每一层次的每一节或每一小节都是一个单独的条款。法案也可能包含法规,基本上是附录,并包含一组类似的章节和小节。每项法令和条例都有生效的日期(不一定相同)。结构的一个简单示例是:

Act1: "Act controlling something" (2001)
    Section 1: This section relates to:
        a.     Something
        b.     These things too:
            1.    A long thing
            2.    A short thing
    Regulation 1: (12 Jan 2004)
        Section 5: This section relates to Section 1 of the main Act
            a.   This applies to everything short
            b.   This applies to everything long
    Regulation 2: (14 Feb 2008)
        Section 6: This section relates to Sections 1 and 2 of the main Act
            a.   This applies to all everything in the sections
            b.   This applies to something

条款和章节是基于主观标准相互关联的,需要手工建立,但可以应用于任何层次,如act1.regulation1.section5.a->act1.section1.b.2或act1.regulation2.section6->act1.section1。这种关系不一定是双向的。
系统需要能够查询这些关系,以便对act1.section1的搜索将显示所有标记为与其或其任何子部分相关的内容,可能还受日期的限制。
系统需要在独立的环境中,所以是基于文件的,而不是基于服务器的。
数据对用户是只读的。
前端和搜索引擎是非常直接的,但是我存储数据,我可能会使用python实现它。
由于后端需要基于文件,我认为sqlite将是最容易使用的数据库。然而,我并不完全相信xml不是一种更好的方法。我唯一担心的是,如果有必要的话,数据库以后可能更容易与其他系统集成。我还可以将两者结合起来,使用xml存储所有的立法,以及一个包含所有链接的sqlite表。
简而言之,我的问题是:对于这种类型的数据,什么是最合适的存储结构?

最佳答案

我会按照你的建议选择“组合”选项。
将实际内容存储在XML中
将关系存储为数据库中的(绝对)xpath对,例如。
['/Act1/Regulation1/Section5/a', '/Act1/Section1/b/2']; ['/Act1/Regulation1/Section5/a', '/Act1/Regulation2/Section6'](即每列2行,第一列不唯一,对是唯一的)
将反向关系存储在具有相同布局的单独表中(用于反向查找):
['/Act1/Section1/b/2', '/Act1/Regulation1/Section5/a']; ['/Act1/Regulation2/Section6', '/Act1/Regulation1/Section5/a'](与上述唯一性约束相同)
如果你想做部分查找,可以在交叉表中添加一个间接的方向(如下所示),或者如果你需要极端的性能(我认为你不需要这样做,因为可能没有太多的数据(少于1亿个关系)),可以使用两个fix trie(作为前缀和后缀trie)。

relation_table (id, id):
[set_112, set119]
[set_112, set120]

set_table (id, prefix, is_full_path):
[set_112, '/Act1', false]
[set_112, '/Act1/Regulation1', false]
[set_112, '/Act1/Regulation1/Section5', true]
...

它是xpath的所有前缀(和/或后缀)的集合。那么,回答上述问题将是:
/Act1/Regulation2
/Act1/Regulation1(即前一个查询的结果)
SELECT set_id FROM set_table WHERE prefix = FOO
原谅我,如果我没有在我的例子中再现你的例子关系。
编辑:根据您对输出的需求(以及初始xml文件的大小),我甚至会避免对原始文档进行xpath查找,而是将xml片段存储在数据库中(就像所有属于每个xpath的实际文本节点一样),然后动态地重构原始xml的较小版本。
XML解析(索引)很慢,因为XML不是。

09-26 01:17