1ad38cafb9136bd7a1f142edfc5e3817f01943d1
[joel/kofoto.git] / src / packages / kofoto / shelfschema.py
1 """Schema of the metadata database."""
2
3 schema = """
4     -- EER diagram without attributes:
5     --
6     --                                          .----.
7     --                                        ,'      |
8     --                   ,^.                ,' N    ,^.
9     --                 ,'   '.  N +----------+    ,'   '.
10     --                <  has  >===| category |---< child >
11     --                 '.   .'    +----------+ 0  '.   .'
12     --                   'v'                        'v'
13     --                    | 0
14     --                    |           ,^.
15     --              N +--------+ 0  ,'   '.  N +-----------+
16     --      .---------| object |---<  has  >===| attribute |
17     --      |         +--------+    '.   ,'    +-----------+
18     --    ,/\.          |    |        'v'
19     --  ,'    '.     __/      \__
20     -- < member >   |            |
21     --  '.    ,'   \|/          \|/
22     --    '\/'      |            |
23     --      | 1 +-------+    +-------+
24     --      '---| album |    | image |
25     --          +-------+    +-------+
26     --                        1 | | 1
27     --                       ,-'   '-.
28     --                     ,^.       ,^.
29     --                   ,'   '.   ,'   '.
30     --                  <  has  > <primary>
31     --                   '.   .'   '.   .'
32     --                     'v'       'v'
33     --                     N \       / 0..1
34     --                      +---------+
35     --                      | version |
36     --                      +---------+
37     --
38     --        |
39     -- where \|/ is supposed to look like the subclass relation symbol.
40     --        |
41
42     -- Administrative information about the database.
43     CREATE TABLE dbinfo (
44         version     INTEGER NOT NULL
45     );
46
47     -- Superclass of objects in an album.
48     CREATE TABLE object (
49         -- Identifier of the object.
50         id          INTEGER NOT NULL,
51
52         PRIMARY KEY (id)
53     );
54
55     -- Albums in the shelf. Subclass of object.
56     CREATE TABLE album (
57         -- Identifier of the album. Shared primary key with object.
58         id          INTEGER NOT NULL,
59         -- Human-memorizable tag.
60         tag         VARCHAR(256) NOT NULL,
61         -- Whether it is possible to delete the album.
62         deletable   INTEGER NOT NULL,
63         -- Album type (plain, orphans or search).
64         type        VARCHAR(256) NOT NULL,
65
66         UNIQUE      (tag),
67         FOREIGN KEY (id) REFERENCES object,
68         PRIMARY KEY (id)
69     );
70
71     -- Images in the shelf. Subclass of object.
72     CREATE TABLE image (
73         -- Internal identifier of the image. Shared primary key with
74         -- object.
75         id          INTEGER NOT NULL,
76
77         -- The primary version. NULL if no such version exists.
78         primary_version INTEGER,
79
80         FOREIGN KEY (id) REFERENCES object,
81         FOREIGN KEY (primary_version) REFERENCES image_version,
82         PRIMARY KEY (id)
83     );
84
85     -- Image versions.
86     CREATE TABLE image_version (
87         -- Identifier of the image version.
88         id          INTEGER NOT NULL,
89
90         -- Identifier of the image associated with this version.
91         image       INTEGER NOT NULL,
92
93         -- Type (original, important or other).
94         type        VARCHAR(20) NOT NULL,
95
96         -- Arbitrary comment about the version.
97         comment     TEXT NOT NULL,
98
99         -- Identifier string which is derived from the image data and
100         -- identifies the image uniquely. Currently an MD5 checksum
101         -- (in hex format) of all image data.
102         hash        CHAR(32) NOT NULL,
103         -- Directory part of the last known location (local pathname)
104         -- of the image.
105         directory   VARCHAR(256) NOT NULL,
106         -- Filename part of the last known location (local pathname)
107         -- of the image.
108         filename    VARCHAR(256) NOT NULL,
109         -- Last known time of modification (UNIX epoch time).
110         mtime       INTEGER NOT NULL,
111         -- Image width.
112         width       INTEGER NOT NULL,
113         -- Image height.
114         height      INTEGER NOT NULL,
115         
116         FOREIGN KEY (image) REFERENCES image,
117         UNIQUE      (hash),
118         PRIMARY KEY (id)
119     );
120
121     CREATE INDEX image_version_image_index ON image_version (image);
122     CREATE INDEX image_version_location_index ON image_version (directory, filename);
123
124     -- Members in an album.
125     CREATE TABLE member (
126         -- Identifier of the album.
127         album       INTEGER NOT NULL,
128         -- Member position, from 0 and up.
129         position    UNSIGNED NOT NULL,
130         -- Key of the member object.
131         object      INTEGER NOT NULL,
132
133         FOREIGN KEY (album) REFERENCES album,
134         FOREIGN KEY (object) REFERENCES object,
135         PRIMARY KEY (album, position)
136     );
137
138     CREATE INDEX member_object_index ON member (object);
139
140     -- Attributes for objects.
141     CREATE TABLE attribute (
142         -- Key of the object.
143         object      INTEGER NOT NULL,
144         -- Name of the attribute.
145         name        TEXT NOT NULL,
146         -- Value of the attribute.
147         value       TEXT NOT NULL,
148         -- Lowercased value of the attribute.
149         lcvalue     TEXT NOT NULL,
150
151         FOREIGN KEY (object) REFERENCES object,
152         PRIMARY KEY (object, name)
153     );
154
155     -- Categories in the shelf.
156     CREATE TABLE category (
157         -- Key of the category.
158         id          INTEGER NOT NULL,
159         -- Human-memorizable tag.
160         tag         TEXT NOT NULL,
161         -- Short description of the category.
162         description TEXT NOT NULL,
163
164         UNIQUE      (tag),
165         PRIMARY KEY (id)
166     );
167
168     -- Parent-child relations between categories.
169     CREATE TABLE category_child (
170         -- Parent category.
171         parent      INTEGER NOT NULL,
172
173         -- Child category.
174         child       INTEGER NOT NULL,
175
176         FOREIGN KEY (parent) REFERENCES category,
177         FOREIGN KEY (child) REFERENCES category,
178         PRIMARY KEY (parent, child)
179     );
180
181     CREATE INDEX category_child_child ON category_child (child);
182
183     -- Category-object mapping.
184     CREATE TABLE object_category (
185         -- Object.
186         object      INTEGER NOT NULL,
187
188         -- Category.
189         category    INTEGER NOT NULL,
190
191         FOREIGN KEY (object) REFERENCES object,
192         FOREIGN KEY (category) REFERENCES category,
193         PRIMARY KEY (object, category)
194     );
195
196     CREATE INDEX object_category_category ON object_category (category);
197 """