annotate Sphinx/source/faq/orthanc-storage.rst @ 272:07f109e3f3f7

database schema
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 30 Aug 2019 09:22:34 +0200
parents 365427cebb64
children 6cbcdb965ad3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
46
12b204ee328d remark about replication
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 37
diff changeset
1 .. _orthanc-storage:
12b204ee328d remark about replication
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 37
diff changeset
2
37
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
3 How does Orthanc store its database?
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
4 ====================================
35
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 Storage folder
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 --------------
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 **By default** (i.e. if no database plugin such as :ref:`PostgreSQL
154
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
10 <postgresql>` or :ref:`MySQL <mysql>` is used), Orthanc stores all the
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
11 DICOM files it receives in a folder called ``OrthancStorage`` on the
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
12 filesystem. Orthanc also associates each incoming DICOM file with a
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
13 JSON file that summarizes all its DICOM tags, which speeds up
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
14 subsequent processing by avoiding a costly DICOM parsing.
35
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 More generally, the ``OrthancStorage`` folder contains a set of
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 so-called **attachments**, that may correspond to either a DICOM file,
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 a JSON file, or any user-defined file. Internally, each attachment is
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 automatically associated with an `universally unique identifier (UUID)
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 <https://en.wikipedia.org/wiki/Universally_unique_identifier>`__.
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 Orthanc can be configured to compress these files on-the-fly in order
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 to save disk space (cf. the ``StorageCompression`` :ref:`configuration
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 option <configuration>`).
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 To reduce the number of files in a single directory (which is
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 something that some operating systems might not like), a 3-level
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 hierarchy of directories is created to store the attachments: The
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 first two hexadecimal characters of the UUID give the first-level
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 folder, and the two next characters give the second-level folder.
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 SQLite index
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 ------------
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 Inside the same ``OrthancStorage`` folder, Orthanc maintains a `SQLite
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 database <https://en.wikipedia.org/wiki/SQLite>`__ called ``index``
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 that **indexes** all these attachments. The database records, for each
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 attachment, its compression method, and its MD5 hashes before and
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 after compression in order to detect disk corruption (cf. the
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 ``StoreMD5ForAttachments`` :ref:`configuration option
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 <configuration>`).
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 One attachment must be associated with one :ref:`DICOM resource
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 <model-world>` (patient, study, series, or instance). Incoming DICOM
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 files and associated JSON summary are associated with one
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 instance-level resource, but user-defined attachments can be
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 associated with any kind of resource.
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 Given one DICOM resource, all of its child attachments are identified
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 by a number between 0 and 65535. Identifiers <= 1023 are reserved for
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 the Orthanc core, whereas identifiers >= 1024 can be user-defined for
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 external applications.
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53
272
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
54 Besides the attachments, the database index maintains other
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
55 information for each DICOM resource, notably the :ref:`metadata
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
56 <metadata>`, the :ref:`history of changes <changes>`, and an
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
57 associative map that stores the so-called "main" DICOM tags (to avoid
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
58 accessing the storage folder are when this is not needed). The SQLite
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
59 database schema is kept as simple as possible, and can be found in the
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
60 following two files of the source code of Orthanc:
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
61 `PrepareDatabase.sql
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
62 <https://bitbucket.org/sjodogne/orthanc/src/Orthanc-1.5.7/OrthancServer/Database/PrepareDatabase.sql>`__
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
63 and `InstallTrackAttachmentsSize.sql
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
64 <https://bitbucket.org/sjodogne/orthanc/src/Orthanc-1.5.7/OrthancServer/Database/InstallTrackAttachmentsSize.sql>`__.
07f109e3f3f7 database schema
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 154
diff changeset
65
35
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 Direct access
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 -------------
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 Directly accessing the content of the ``OrthancStorage`` folder and
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 the content of the SQLite database is strongly discouraged for several
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 reasons:
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 * This internal organization is only true when no database plugin is
154
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
75 used (e.g. the :ref:`PostgreSQL <postgresql>` and :ref:`MySQL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
76 <mysql>` plugins can be configured to store the attachments inside a
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 46
diff changeset
77 database).
35
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 * Orthanc can be configured to compress the attachments before writing
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 them on the disk (cf. the ``StorageCompression`` option).
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 * By directly reading the content of ``OrthancStorage``, you bypass
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 all the locking mechanisms used by Orthanc, which might result in
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 data corruption.
36
6474af38dcbd SQLITE_BUSY
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 35
diff changeset
83 * One SQLite database should be accessed by at most one process at any
6474af38dcbd SQLITE_BUSY
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 35
diff changeset
84 time to avoid any problem (e.g. with NFS filesystems), for reasons
6474af38dcbd SQLITE_BUSY
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 35
diff changeset
85 that are `explained in the SQLite FAQ
6474af38dcbd SQLITE_BUSY
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 35
diff changeset
86 <https://www.sqlite.org/faq.html#q5>`__. Orthanc will stop if it
6474af38dcbd SQLITE_BUSY
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 35
diff changeset
87 receives the ``SQLITE_BUSY`` status.
35
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 As a consequence, it is **HIGHLY recommended NOT to directly access**
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 the ``OrthancStorage`` folder and the SQLite database. Use the
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 :ref:`REST API <rest>` instead, which contains primitives to access
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 the attachments (cf. the ``.../attachments/...`` URIs).
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 The only exception to this rule is for **read-only access when Orthanc
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 is stopped**, e.g. as a part of a :ref:`backup <backup>` or
5737f51ff94e How does Orthanc stores its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 :ref:`upgrade/replication <replication>` process.