<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>QQuuicikckDDBB{{YYetetAAnnotohthererDDataatbabasaeseMMananagagememenentt SSyystsetmem????</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Radim Baca</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Peter Chovanec</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Michal Kratky</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Petr Lukas Radim Baca</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Peter Chovanec</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Michal Kratky</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Petr Lukas</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Computer Science</institution>
          ,
          <addr-line>FEECS, VSB</addr-line>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>No. SP2014/211</institution>
          ,
          <country country="CZ">Czech Republic</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Technical University of Ostrava Department of</institution>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>iversity of Ostrava 17. listopadu 15</institution>
          ,
          <addr-line>Ostrava, 708 33</addr-line>
          ,
          <country country="CZ">Czech Republic</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2014</year>
      </pub-date>
      <fpage>91</fpage>
      <lpage>99</lpage>
      <abstract>
        <p>Although DBMS (Database Management Systems) are often hidden for a user, they are a part of many applications utilized in day-by-day life. In general, we can suppose two main types of DBMS: OLTP (On-Line Transaction Processing) and OLAP (On-Line Analytical Processing). We can also distinguish another classi cation related to the connection of a client and DBMS: client-server and embedded DBMS. The embedded DBMS enable to achieve the maximum performance since an often slow network connection is not used. As a result, they are utilized by in-memory computations where the maximum throughput is required. Although it seems that a lot of high quality DBMS exist and another DBMS are not required, there is not a system to meet all demands of the real world. In this paper, we introduce our prototype of embedded database system called QuickDB. We show that it includes a wide variety of data structures and it provides more e cient performance in many cases compared to up-to-date (embedded) DBMS.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        Firebird [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] and others. The major representatives of the embedded DBMS are
the following systems: Microsoft Access1, SQLite [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ], Berkeley DB [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ],
eXtremeDB2 and so on. When we consider only relational DBMS, many database
systems have appeared during 35 years of their development (see the genealogy
of relational DBMS [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]).
      </p>
      <p>
        Although it seems that a lot of high quality DBMS exist and another DBMS
are not required, there is not a system to meet all demands of the real world.
For example, Berkeley DB provides the high performance of the B-tree and the
paged queue, but it does not support any multidimensional data structure. On
the other hand, in the case of libraries including an R-tree implementation (see
Table 1), they support especially in-memory implementations, which penalizes
them in the case of huge data. Moreover, they do not often support any other
data structures. In this paper, we introduce a long-time project of the Database
Research Group3, a prototype DBMS called QuickDB [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. It includes a wide
variety of data structures and it provides more e cient performance in many
cases compared to up-to-date DBMS. In Table 1, we show a comparison of
individual features of selected DBMS and libraries. We can see that there are only
two DBMS supporting all features: QuickDB and SQLite. However, SQLite do
not use any cache bu er for data; only the operating system's cache is used during
le operations. We must note that the table does not consider all features of
DBMS (a support of transaction processing, availability for more platforms, e.g.
UNIX and Windows, and so on). Since a performance comparison of embedded
and client-server DBMS is rather problematic, QuickDB is compared only with
embedded DBMS and libraries.
1 http://office.microsoft.com/en-us/access/
2 http://www.mcobject.com/extremedbfamily.shtml
3 http://db.cs.vsb.cz/
      </p>
      <p>This paper is organized as follows. In Section 2, we describe an architecture
of QuickDB. In Section 3, we put forward a comparison of QuickDB with other
DBMS. In the last section, the paper content is resumed and the possibility of
a future work is outlined.
2</p>
    </sec>
    <sec id="sec-2">
      <title>QuickDB</title>
      <p>In Figure 2, we see an architecture of QuickDB4. The cache bu er preserves
pages of data structures to prevent disk accesses when a page is required. The
overhead of the page size compared to the size on a disk is approximately 20%,
i.e. the in-memory page size is 9,830B in the case of the 8kB page size. When
a data structure operation returns a result, e.g. the range query, the result is
stored in a ResultSet and returned to a user. After the user closes the ResultSet,
it is returned to QuickDB.</p>
      <sec id="sec-2-1">
        <title>ResultSet 0 ...</title>
      </sec>
      <sec id="sec-2-2">
        <title>ResultSet n</title>
      </sec>
      <sec id="sec-2-3">
        <title>QuickDB</title>
      </sec>
      <sec id="sec-2-4">
        <title>Core</title>
      </sec>
      <sec id="sec-2-5">
        <title>B+-tree</title>
      </sec>
      <sec id="sec-2-6">
        <title>R-tree</title>
      </sec>
      <sec id="sec-2-7">
        <title>Paged Queue</title>
      </sec>
      <sec id="sec-2-8">
        <title>Cache Buffer</title>
      </sec>
      <sec id="sec-2-9">
        <title>Disk</title>
        <p>There exists an implementation of the B-tree, R-tree, and paged queue
utilizing the core of QuickDB. The goal of QuickDB is to provide the maximum
performance instead of an implementation of rich functionalities like a support
of methods stored in a database and so on.
4 QuickDB is implemented in C++.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Comparison of DBMS</title>
      <p>Testing Environment
We perform a set of various tests where we compare our QuickDB with
state-ofthe-art implementations in each area. By the term area we mean a data structure
type. Moreover, in Section 3.4, we show results of an application of QuickDB {
a native XML database.</p>
      <p>All experiments are executed in a single thread on an Intel Xeon 2.9 GHz
CPU. We use a real data set of meteorological measurements of the Czech
Hydrometeorological Institute5, where the dimension of each record is 5. The
collection contains 57,852,305 records and the total size of its textual representation
is 1.12 GB. Queries used during the tests are randomly generated.
3.2</p>
      <p>
        Comparison of Basic Data Structures
In this test, we compare the performance of two QuickDB basic data structures:
the B-tree and the heap table (paged queue). The B-tree is a traditional data
structure used by all relational DBMS [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. The heap table is also supported by
all relational DBMS and we test just a sequential scan in the heap table using a
cursor.
      </p>
      <p>B-tree We compare the QuickDB's B-tree performance of the insert and point
query operations with the Berkeley DB and SQLite here. The performance of the
insert operation can be in uenced by several di erent aspects where we consider
the following: (1) whether the data t into the main memory cache or not, and
(2) whether the data are sorted before the insert or not. All combinations for
each B-tree are tested and the results are summarized in Table 2.</p>
      <p>We can observe that SQLite performs worst in all cases. An overhead of
SQLite is probably induced by the SQL interface and lack of its own bu er
cache. Clearly, QuickDB and Berkeley DB have very similar performance on our
data set, however, QuickDB slightly outperforms Berkeley DB in all tests. The
only disadvantage of QuickDB is its a slightly bigger index.</p>
      <p>Heap Table (Paged Queue) Now we compare the performance of the QuickDB's
heap table with the Berkeley DB's queue. We use the Berkeley DB's queue since
it supports the insert and sequential scan operations. The insert operation is
preformed with limited memory, however, it is not very important here since
only a sequential write is utilized. Then we perform the sequential scan with
both cold and warm caches. The term warm cache means that all the data are
already stored in the main memory.</p>
      <p>Results are shown in Table 3. QuickDB is twice faster during the insert than
Berkeley DB. Surprisingly, the performance of the Berkeley DB queue scan is
5 http://www.chmi.cz/</p>
      <sec id="sec-3-1">
        <title>Operations</title>
        <p>Sorted insertion
80% of data [thousands per second]
t in the main Random insertion
memory [thousands per second]</p>
        <p>Sorted insertion
All data [thousands per second]
t in the main Random insertion
memory [thousands per second]
Queries [s]
Index size [GB]
531
289
674
357</p>
      </sec>
      <sec id="sec-3-2">
        <title>QuickDB</title>
      </sec>
      <sec id="sec-3-3">
        <title>Berkeley DB</title>
      </sec>
      <sec id="sec-3-4">
        <title>SQLite</title>
        <p>the same no matter whether the cache is cold or not. It leads us to a conclusion
that Berkeley DB uses the OS le system cache which in uences the results.
However, QuickDB signi cantly outperforms Berkeley DB during in-memory
sequential scan. On the other hand, the size of the Berkeley DB index le is
quarter of the data set size, whereas, the QuickDB index le is equal to the data
size.</p>
      </sec>
      <sec id="sec-3-5">
        <title>QuickDB</title>
      </sec>
      <sec id="sec-3-6">
        <title>Berkeley DB</title>
        <p>Inserting [thousands</p>
        <p>
          per second]
Sequential scan (warm) [s]
Sequential scan (cold) [s]
Index size [GB]
2,244
In this section, we compare a performance a multidimensional data structure
called the R-tree [
          <xref ref-type="bibr" rid="ref10 ref3">10, 3</xref>
          ] implemented in QuickDB with some other existing
implementations. We compare the performance of both insert and range query
operations. In the experiments, we use three collections of queries (a detail
description is shown in Table 4).
        </p>
        <p>
          The performance of inserting and query processing is compared with several
libraries, namely Boost [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ], libSpatialIndex [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ], RTreeStar [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ], Superliminal
Rtree [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ], and SQLite [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ] as a representative of embedded database systems.
Relational DBMS based on a client-server architecture (Oracle, PostgreSQL,
MySQL, and so on) have not been taken into account since it is rather
problematic to compare embedded and client-server DBMS.
        </p>
        <p>
          Since all tested libraries (except QuickDB and libSpatialIndex) support only
an in-memory storage, no secondary storage has been used during the
experiments and we do not measure the size of the indices. The page size is 8kB
in all cases. In Table 5, we see that QuickDB and Boost provide the highest
performance. While Boost is more e cient in the case of the insert operation,
QuickDB slightly outperforms it in the case of query processing. We see that
other implementations are outperformed by QuickDB and Boost.
In this section, we present an application of the QuickDB framework. It is a
native XML database called QuickXDB introduced in [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]. We brie y discuss how
the QuickDB framework is exploited here and compare it with some other
solutions.
        </p>
        <p>
          Data structures There are two indexes representing an XML data collection,
namely document index and partition index [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. The document index serves as
a primary access path since it fully describes both tree structure and actual text
values of an XML collection6. We exploit two persistent data structures of the
QuickDB framework: the B-tree and the paged queue.
6 The reader is expected to understand the terms of the XML tree data model.
        </p>
        <p>The B-tree of the document index has a node label as a key. There are two
fundamental purposes of the node label: (1) it uniquely identi es each XML
data node and (2) we are able to resolve a structural relationship of two nodes,
e.g., one is a parent of another. The leaf nodes of the B-tree contain tags (node
names) of XML nodes and pointers into the paged queue where text values are
stored. The records for XML nodes in the leaf nodes of the B-tree are stored in
the same order as in the original XML document or collection. Consequently,
we can pro t from using range queries to obtain the whole subtree of an XML
node.</p>
        <p>The partition index is the secondary access path. It is also a combination
of the B-tree and the paged queue. However, here a tag name serves as a key
and items of the B-tree leaf nodes include pointers to paged queues where
corresponding node labels are stored in the document order.</p>
        <p>Experimental evaluation We have performed a time comparison with 2 other
native XML databases: MonetDB7 and BaseX8. We have picked up 4 data
collections: XMark9 with factor f = 10 (1.1 GB), Swissprot (109 MB), TreeBank
(82 MB), and DBLP (127 MB)10.</p>
        <p>For each collection, we have generated 3 sets of 50 distinct random XPath
queries oriented purely on searching structural relationships between XML nodes.
The sets di er in the upper range of their selectivity 11: (1) selectivity up to 100%,
(2) selectivity up to 10%, and (3) selectivity up to 1%. Di erent query selectivity
can cause a di erent utilization of indexes. The complexity of queries vary for a
di erent number of location steps (from 2 to 11) and also for a di erent number
of branching predicates (from 0 to 4). Both ancestor-descendant and parent-child
tree axes are randomly used. Branching predicates contain either single XPath
subqueries or more subqueries connected by a logical conjunction.</p>
        <p>Summarized results are presented in Figure 2. The values on the vertical
axis stand for the total processing time of a set of queries. Each single query was
evaluated 5 times, only arithmetic means of 3 times (without the best and the
worst case) are considered.</p>
        <p>We can see that our QuickXDB outperforms BaseX on all query sets
except XMark with selectivity up to 1% and 10%. We also evaluate queries with
the higher selectivity (up to 1% and 10%) on DBLP, Swissprot, and TreeBank
collections faster than MonetDB. On the Swissprot query set with selectivity
up to 1%, QuickXDB is more than 20 faster than BaseX and 8 faster than
MonetDB. On the other hand, our QuickXDB is approximately 2:5 slower than
MonetDB on DBLP and XMark query sets with selectivity up to 100% and 3:3
slower than BaseX on XMark with selectivity up to 10%.
7 http://www.monetdb.org/XQuery/
8 http://www.basex.org
9 http://www.xml-benchmark.org/
10 http://www.cs.washington.edu/research/xmldatasets/www/repository.html
11 If we for example have a query //a[./b]//c, selectivity can be computed as
count(//a[./b]//c) div count(//c)
[s] 30
25
20
15
10
5
0</p>
        <p>P
L
B
D
)
%
0
0
1
(</p>
        <p>P
L
B
D
)
%
0
1
(</p>
        <p>P
L
B
D
)
%
1
(
t
o
r
p
s
s
i
w
S
)
%
0
0
1
(
t
o
r
p
s
s
i
w
S
)
%
0
1
(
t
o
r
p
s
s
i
w
S
)
%
1
(
k
n
a
B
e
e
r
T
)
%
0
0
1
(
k
n
a
B
e
e
r
T
)
%
0
1
(
k
n
a
B
e
e
r
T
)
%
1
(
k
r
a
M
X
)
%
0
0
1
(
k
r
a
M
X
)
%
0
1
(
In this paper, we introduced a comparison of our prototype of embedded database
system called QuickDB with other up-to-date embedded DBMS and libraries. As
mentioned, the main goal of QuickDB is to provide the maximum performance.
The results show that QuickDB outperforms these DBMS and libraries in a lot
of cases. In our future work, we want to compare other features of DBMS, for
example, scalability performance, transaction processing performance and so on.</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>R.</given-names>
            <surname>Baca</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Kratky. XML Query</surname>
          </string-name>
          <article-title>Processing E ciency and Optimality</article-title>
          .
          <source>In Proceeding IDEAS 12 Proceedings of the 16th International Database Engineering &amp; Applications Symposium</source>
          , pages
          <volume>8</volume>
          {
          <fpage>13</fpage>
          . ACM,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>R.</given-names>
            <surname>Bayer</surname>
          </string-name>
          and
          <string-name>
            <given-names>E. M.</given-names>
            <surname>McCreight</surname>
          </string-name>
          .
          <article-title>Organization and Maintenance of Large Ordered Indices</article-title>
          .
          <source>Acta Inf.</source>
          ,
          <volume>1</volume>
          :
          <fpage>173</fpage>
          {
          <fpage>189</fpage>
          ,
          <year>1972</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>N.</given-names>
            <surname>Beckmann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.-P.</given-names>
            <surname>Kriegel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Schneider</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B.</given-names>
            <surname>Seeger. The R -Tree</surname>
          </string-name>
          :
          <article-title>An E cient and Robust Access Method for Points and Rectangles</article-title>
          .
          <source>In Proceedings of the ACM International Conference on Management of Data (SIGMOD</source>
          <year>1990</year>
          ),
          <year>1990</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4. Boost.org. Boost C++ Libraries, http://www.boost.org/,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. Database Reasearch Group. QuickDB, http://db.cs.vsb.cz/,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>C.</given-names>
            <surname>Date</surname>
          </string-name>
          .
          <article-title>An Introduction to Database Systems</article-title>
          .
          <source>Addison-Wesley, 8th edition</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>G.</given-names>
            <surname>Douglas. Superliminal Rtree</surname>
          </string-name>
          , http://superliminal.com/sources/ sources.htm#C%
          <volume>20</volume>
          &amp;%20C++%20Code,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>Firebird</given-names>
            <surname>Foundation</surname>
          </string-name>
          <article-title>Incorporated</article-title>
          . Firebird, http://www.firebirdsql.org/,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>H.</given-names>
            <surname>Garcia-Molina</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Ullman</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Widom</surname>
          </string-name>
          .
          <source>Database Systems: The Complete Book. Prentice Hall, 2nd edition</source>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>A.</given-names>
            <surname>Guttman. R-Trees</surname>
          </string-name>
          :
          <article-title>A Dynamic Index Structure for Spatial Searching</article-title>
          .
          <source>In Proceedings of the ACM International Conference on Management of Data (SIGMOD</source>
          <year>1984</year>
          ), pages
          <fpage>47</fpage>
          {
          <fpage>57</fpage>
          . ACM Press,
          <year>June 1984</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <given-names>M.</given-names>
            <surname>Hadjieleftheriou</surname>
          </string-name>
          . libSpatialIndex, http://libspatialindex.github.io/,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Hasso-Plattner-Institut</surname>
          </string-name>
          .
          <source>The HPI Genealogy of Relational Database Management Systems</source>
          , http://www.hpi.uni-potsdam.de/naumann/projekte/ rdbms_genealogy.html,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <given-names>P.</given-names>
            <surname>Lukas</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Baca</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Kratky</surname>
          </string-name>
          .
          <article-title>QuickXDB: A Prototype of a Native XML DBMS</article-title>
          .
          <source>In Proceedings of the Dateso 2013 Annual International Workshop</source>
          , pages
          <volume>36</volume>
          {
          <fpage>47</fpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Microsoft</surname>
          </string-name>
          .
          <source>Microsoft SQL Server</source>
          <year>2012</year>
          , http://www.microsoft.com/en-us/ sqlserver/default.aspx,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <given-names>S. Negash. Business</given-names>
            <surname>Intelligence</surname>
          </string-name>
          .
          <source>Communications of the Association for Information Systems</source>
          ,
          <volume>13</volume>
          , http://aisel.aisnet.org/cais/vol13/iss1/15,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Oracle. MySQL Community Edition</surname>
          </string-name>
          , http://www.mysql.com/products/community/,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Oracle</surname>
          </string-name>
          . Oracle Berkeley DB 12c, http://www.oracle.com/technetwork/database/ berkeleydb,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Oracle</surname>
          </string-name>
          . Oracle Database 12c, http://www.oracle.com/us/products/database/ overview/index.html,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <given-names>D.</given-names>
            <surname>Spicuzza</surname>
          </string-name>
          . R*
          <article-title>Tree Implementation for C++</article-title>
          , http://www.virtualroadside.com/blog/index.php/
          <year>2008</year>
          /10/04/ r-tree-implementation
          <string-name>
            <surname>-</surname>
          </string-name>
          for-cpp/,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <string-name>
            <given-names>SQLite</given-names>
            <surname>Consortium</surname>
          </string-name>
          . Sqlite, http://www.sqlite.org/,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21. The PostgreSQL Global Development Group. PostgreSQL, http://www.postgresql.org/,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>