35 lines
1 KiB
SQL
35 lines
1 KiB
SQL
PRAGMA journal_mode = WAL;
|
|
|
|
CREATE TABLE media(
|
|
id INTEGER PRIMARY KEY,
|
|
storage_id TEXT (64) NOT NULL UNIQUE,
|
|
filename TEXT (256) NOT NULL,
|
|
content_type TEXT (256),
|
|
upload_datetime TEXT (32) DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE kind(
|
|
id TEXT (32) PRIMARY KEY,
|
|
name TEXT (256) NOT NULL UNIQUE
|
|
) WITHOUT ROWID;
|
|
|
|
CREATE TABLE tag(
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT (256) NOT NULL,
|
|
kind_id TEXT (32) REFERENCES kind(id) ON UPDATE CASCADE,
|
|
display TEXT (289) AS (concat_ws(':', kind_id, name)) STORED,
|
|
UNIQUE (name, kind_id)
|
|
);
|
|
CREATE INDEX tag_name_idx ON tag(name);
|
|
CREATE UNIQUE INDEX tag_name_kind_id_idx ON tag(name, kind_id);
|
|
CREATE UNIQUE INDEX tag_display_idx ON tag(display);
|
|
|
|
CREATE TABLE media_tag(
|
|
media_id INTEGER NOT NULL,
|
|
tag_id INTEGER NOT NULL,
|
|
FOREIGN KEY (media_id) REFERENCES media(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (media_id, tag_id)
|
|
);
|
|
CREATE INDEX media_tag_media_id_idx ON media_tag(media_id);
|
|
CREATE INDEX media_tag_tag_id_idx ON media_tag(tag_id);
|