diff options
Diffstat (limited to 'util/sql/schema.sql')
-rw-r--r-- | util/sql/schema.sql | 511 |
1 files changed, 355 insertions, 156 deletions
diff --git a/util/sql/schema.sql b/util/sql/schema.sql index 59240ea9..b43079dc 100644 --- a/util/sql/schema.sql +++ b/util/sql/schema.sql @@ -1,3 +1,38 @@ +-- Convention for database items with version control: +-- +-- CREATE TABLE items ( +-- id SERIAL PRIMARY KEY, +-- locked boolean NOT NULL DEFAULT FALSE, +-- hidden boolean NOT NULL DEFAULT FALSE, +-- -- item-specific columns here +-- ); +-- CREATE TABLE items_hist ( -- History of the 'items' table +-- chid integer NOT NULL, -- references changes.id +-- -- item-specific columns here +-- ); +-- +-- The history of the 'locked' and 'hidden' flags is recorded in the changes +-- table. It's possible for 'items' to have more item-specific columns than +-- 'items_hist'. Some columns are caches or otherwise autogenerated, and do not +-- need to be versioned. +-- +-- item-related tables work roughly the same: +-- +-- CREATE TABLE items_field ( +-- id integer, -- references items.id +-- -- field-specific columns here +-- ); +-- CREATE TABLE items_field_hist ( -- History of the 'items_field' table +-- chid integer, -- references changes.id +-- -- field-specific columns here +-- ); +-- +-- The changes and *_hist tables contain all the data. In a sense, the other +-- tables related to the item are just a cache/view into the latest versions. +-- All modifications to the item tables has to go through the edit_* functions +-- in func.sql, these are also responsible for keeping things synchronized. + + -- affiliate_links CREATE TABLE affiliate_links ( id SERIAL PRIMARY KEY, @@ -26,29 +61,44 @@ CREATE TABLE anime ( -- changes CREATE TABLE changes ( - id SERIAL NOT NULL PRIMARY KEY, - type dbentry_type NOT NULL, - rev integer NOT NULL DEFAULT 1, - added timestamptz NOT NULL DEFAULT NOW(), - requester integer NOT NULL DEFAULT 0, - ip inet NOT NULL DEFAULT '0.0.0.0', - comments text NOT NULL DEFAULT '', - ihid boolean NOT NULL DEFAULT FALSE, - ilock boolean NOT NULL DEFAULT FALSE + id SERIAL PRIMARY KEY, + type dbentry_type NOT NULL, + itemid integer NOT NULL, + rev integer NOT NULL DEFAULT 1, + added timestamptz NOT NULL DEFAULT NOW(), + requester integer NOT NULL DEFAULT 0, + ip inet NOT NULL DEFAULT '0.0.0.0', + comments text NOT NULL DEFAULT '', + ihid boolean NOT NULL DEFAULT FALSE, + ilock boolean NOT NULL DEFAULT FALSE ); -- chars CREATE TABLE chars ( - id SERIAL PRIMARY KEY, - latest integer NOT NULL DEFAULT 0, - locked boolean NOT NULL DEFAULT FALSE, - hidden boolean NOT NULL DEFAULT FALSE + id SERIAL PRIMARY KEY, + locked boolean NOT NULL DEFAULT FALSE, + hidden boolean NOT NULL DEFAULT FALSE, + name varchar(250) NOT NULL DEFAULT '', + original varchar(250) NOT NULL DEFAULT '', + alias varchar(500) NOT NULL DEFAULT '', + image integer NOT NULL DEFAULT 0, + "desc" text NOT NULL DEFAULT '', + gender gender NOT NULL DEFAULT 'unknown', + s_bust smallint NOT NULL DEFAULT 0, + s_waist smallint NOT NULL DEFAULT 0, + s_hip smallint NOT NULL DEFAULT 0, + b_month smallint NOT NULL DEFAULT 0, + b_day smallint NOT NULL DEFAULT 0, + height smallint NOT NULL DEFAULT 0, + weight smallint NOT NULL DEFAULT 0, + bloodt blood_type NOT NULL DEFAULT 'unknown', + main integer, -- chars.id + main_spoil smallint NOT NULL DEFAULT 0 ); --- chars_rev -CREATE TABLE chars_rev ( - id integer NOT NULL PRIMARY KEY, - cid integer NOT NULL, +-- chars_hist +CREATE TABLE chars_hist ( + chid integer NOT NULL PRIMARY KEY, name varchar(250) NOT NULL DEFAULT '', original varchar(250) NOT NULL DEFAULT '', alias varchar(500) NOT NULL DEFAULT '', @@ -63,25 +113,42 @@ CREATE TABLE chars_rev ( height smallint NOT NULL DEFAULT 0, weight smallint NOT NULL DEFAULT 0, bloodt blood_type NOT NULL DEFAULT 'unknown', - main integer, + main integer, -- chars.id main_spoil smallint NOT NULL DEFAULT 0 ); -- chars_traits CREATE TABLE chars_traits ( - cid integer NOT NULL, - tid integer NOT NULL, - spoil smallint NOT NULL DEFAULT 0, - PRIMARY KEY(cid, tid) + id integer NOT NULL, + tid integer NOT NULL, -- traits.id + spoil smallint NOT NULL DEFAULT 0, + PRIMARY KEY(id, tid) +); + +-- chars_traits_hist +CREATE TABLE chars_traits_hist ( + chid integer NOT NULL, + tid integer NOT NULL, -- traits.id + spoil smallint NOT NULL DEFAULT 0, + PRIMARY KEY(chid, tid) ); -- chars_vns CREATE TABLE chars_vns ( - cid integer NOT NULL, - vid integer NOT NULL, - rid integer NULL, - spoil smallint NOT NULL DEFAULT 0, - role char_role NOT NULL DEFAULT 'main' + id integer NOT NULL, + vid integer NOT NULL, -- vn.id + rid integer NULL, -- releases.id + spoil smallint NOT NULL DEFAULT 0, + role char_role NOT NULL DEFAULT 'main' +); + +-- chars_vns_hist +CREATE TABLE chars_vns_hist ( + chid integer NOT NULL, + vid integer NOT NULL, -- vn.id + rid integer NULL, -- releases.id + spoil smallint NOT NULL DEFAULT 0, + role char_role NOT NULL DEFAULT 'main' ); -- login_throttle @@ -106,33 +173,47 @@ CREATE TABLE notifications ( -- producers CREATE TABLE producers ( - id SERIAL NOT NULL PRIMARY KEY, - latest integer NOT NULL DEFAULT 0, - locked boolean NOT NULL DEFAULT FALSE, - hidden boolean NOT NULL DEFAULT FALSE, - rgraph integer + id SERIAL PRIMARY KEY, + locked boolean NOT NULL DEFAULT FALSE, + hidden boolean NOT NULL DEFAULT FALSE, + type producer_type NOT NULL DEFAULT 'co', + name varchar(200) NOT NULL DEFAULT '', + original varchar(200) NOT NULL DEFAULT '', + website varchar(250) NOT NULL DEFAULT '', + lang language NOT NULL DEFAULT 'ja', + "desc" text NOT NULL DEFAULT '', + alias varchar(500) NOT NULL DEFAULT '', + l_wp varchar(150), + rgraph integer -- relgraphs.id +); + +-- producers_hist +CREATE TABLE producers_hist ( + chid integer NOT NULL PRIMARY KEY, + type producer_type NOT NULL DEFAULT 'co', + name varchar(200) NOT NULL DEFAULT '', + original varchar(200) NOT NULL DEFAULT '', + website varchar(250) NOT NULL DEFAULT '', + lang language NOT NULL DEFAULT 'ja', + "desc" text NOT NULL DEFAULT '', + alias varchar(500) NOT NULL DEFAULT '', + l_wp varchar(150) ); -- producers_relations CREATE TABLE producers_relations ( - pid1 integer NOT NULL, - pid2 integer NOT NULL, - relation producer_relation NOT NULL, - PRIMARY KEY(pid1, pid2) + id integer NOT NULL, + pid integer NOT NULL, -- producers.id + relation producer_relation NOT NULL, + PRIMARY KEY(id, pid) ); --- producers_rev -CREATE TABLE producers_rev ( - id integer NOT NULL PRIMARY KEY, - pid integer NOT NULL DEFAULT 0, - type producer_type NOT NULL DEFAULT 'co', - name varchar(200) NOT NULL DEFAULT '', - original varchar(200) NOT NULL DEFAULT '', - website varchar(250) NOT NULL DEFAULT '', - lang language NOT NULL DEFAULT 'ja', - "desc" text NOT NULL DEFAULT '', - alias varchar(500) NOT NULL DEFAULT '', - l_wp varchar(150) +-- producers_relations_hist +CREATE TABLE producers_relations_hist ( + chid integer NOT NULL, + pid integer NOT NULL, -- producers.id + relation producer_relation NOT NULL, + PRIMARY KEY(chid, pid) ); -- quotes @@ -144,71 +225,124 @@ CREATE TABLE quotes ( -- releases CREATE TABLE releases ( - id SERIAL NOT NULL PRIMARY KEY, - latest integer NOT NULL DEFAULT 0, - locked boolean NOT NULL DEFAULT FALSE, - hidden boolean NOT NULL DEFAULT FALSE + id SERIAL PRIMARY KEY, + locked boolean NOT NULL DEFAULT FALSE, + hidden boolean NOT NULL DEFAULT FALSE, + title varchar(250) NOT NULL DEFAULT '', + original varchar(250) NOT NULL DEFAULT '', + type release_type NOT NULL DEFAULT 'complete', + website varchar(250) NOT NULL DEFAULT '', + catalog varchar(50) NOT NULL DEFAULT '', + gtin bigint NOT NULL DEFAULT 0, + released integer NOT NULL DEFAULT 0, + notes text NOT NULL DEFAULT '', + minage smallint, + patch boolean NOT NULL DEFAULT FALSE, + freeware boolean NOT NULL DEFAULT FALSE, + doujin boolean NOT NULL DEFAULT FALSE, + resolution smallint NOT NULL DEFAULT 0, + voiced smallint NOT NULL DEFAULT 0, + ani_story smallint NOT NULL DEFAULT 0, + ani_ero smallint NOT NULL DEFAULT 0 +); + +-- releases_hist +CREATE TABLE releases_hist ( + chid integer NOT NULL PRIMARY KEY, + title varchar(250) NOT NULL DEFAULT '', + original varchar(250) NOT NULL DEFAULT '', + type release_type NOT NULL DEFAULT 'complete', + website varchar(250) NOT NULL DEFAULT '', + catalog varchar(50) NOT NULL DEFAULT '', + gtin bigint NOT NULL DEFAULT 0, + released integer NOT NULL DEFAULT 0, + notes text NOT NULL DEFAULT '', + minage smallint, + patch boolean NOT NULL DEFAULT FALSE, + freeware boolean NOT NULL DEFAULT FALSE, + doujin boolean NOT NULL DEFAULT FALSE, + resolution smallint NOT NULL DEFAULT 0, + voiced smallint NOT NULL DEFAULT 0, + ani_story smallint NOT NULL DEFAULT 0, + ani_ero smallint NOT NULL DEFAULT 0 ); -- releases_lang CREATE TABLE releases_lang ( - rid integer NOT NULL, - lang language NOT NULL, - PRIMARY KEY(rid, lang) + id integer NOT NULL, + lang language NOT NULL, + PRIMARY KEY(id, lang) +); + +-- releases_lang_hist +CREATE TABLE releases_lang_hist ( + chid integer NOT NULL, + lang language NOT NULL, + PRIMARY KEY(chid, lang) ); -- releases_media CREATE TABLE releases_media ( - rid integer NOT NULL DEFAULT 0, - medium medium NOT NULL, - qty smallint NOT NULL DEFAULT 1, - PRIMARY KEY(rid, medium, qty) + id integer NOT NULL, + medium medium NOT NULL, + qty smallint NOT NULL DEFAULT 1, + PRIMARY KEY(id, medium, qty) +); + +-- releases_media_hist +CREATE TABLE releases_media_hist ( + chid integer NOT NULL, + medium medium NOT NULL, + qty smallint NOT NULL DEFAULT 1, + PRIMARY KEY(chid, medium, qty) ); -- releases_platforms CREATE TABLE releases_platforms ( - rid integer NOT NULL DEFAULT 0, - platform platform NOT NULL, - PRIMARY KEY(rid, platform) + id integer NOT NULL, + platform platform NOT NULL, + PRIMARY KEY(id, platform) +); + +-- releases_platforms_hist +CREATE TABLE releases_platforms_hist ( + chid integer NOT NULL, + platform platform NOT NULL, + PRIMARY KEY(chid, platform) ); -- releases_producers CREATE TABLE releases_producers ( - pid integer NOT NULL, - rid integer NOT NULL, - developer boolean NOT NULL DEFAULT FALSE, - publisher boolean NOT NULL DEFAULT TRUE, + id integer NOT NULL, + pid integer NOT NULL, -- producers.id + developer boolean NOT NULL DEFAULT FALSE, + publisher boolean NOT NULL DEFAULT TRUE, CHECK(developer OR publisher), - PRIMARY KEY(pid, rid) + PRIMARY KEY(id, pid) ); --- releases_rev -CREATE TABLE releases_rev ( - id integer NOT NULL PRIMARY KEY, - rid integer NOT NULL DEFAULT 0, - title varchar(250) NOT NULL DEFAULT '', - original varchar(250) NOT NULL DEFAULT '', - type release_type NOT NULL DEFAULT 'complete', - website varchar(250) NOT NULL DEFAULT '', - released integer NOT NULL DEFAULT 0, - notes text NOT NULL DEFAULT '', - minage smallint, - gtin bigint NOT NULL DEFAULT 0, - patch boolean NOT NULL DEFAULT FALSE, - catalog varchar(50) NOT NULL DEFAULT '', - resolution smallint NOT NULL DEFAULT 0, - voiced smallint NOT NULL DEFAULT 0, - freeware boolean NOT NULL DEFAULT FALSE, - doujin boolean NOT NULL DEFAULT FALSE, - ani_story smallint NOT NULL DEFAULT 0, - ani_ero smallint NOT NULL DEFAULT 0 +-- releases_producers_hist +CREATE TABLE releases_producers_hist ( + chid integer NOT NULL, + pid integer NOT NULL, -- producers.id + developer boolean NOT NULL DEFAULT FALSE, + publisher boolean NOT NULL DEFAULT TRUE, + CHECK(developer OR publisher), + PRIMARY KEY(chid, pid) ); -- releases_vn CREATE TABLE releases_vn ( - rid integer NOT NULL DEFAULT 0, - vid integer NOT NULL DEFAULT 0, - PRIMARY KEY(rid, vid) + id integer NOT NULL, + vid integer NOT NULL, -- vn.id + PRIMARY KEY(id, vid) +); + +-- releases_vn_hist +CREATE TABLE releases_vn_hist ( + chid integer NOT NULL, + vid integer NOT NULL, -- vn.id + PRIMARY KEY(chid, vid) ); -- relgraphs @@ -244,33 +378,47 @@ CREATE TABLE sessions ( -- staff CREATE TABLE staff ( - id SERIAL NOT NULL PRIMARY KEY, - latest integer NOT NULL DEFAULT 0, - locked boolean NOT NULL DEFAULT FALSE, - hidden boolean NOT NULL DEFAULT FALSE + id SERIAL PRIMARY KEY, + locked boolean NOT NULL DEFAULT FALSE, + hidden boolean NOT NULL DEFAULT FALSE, + aid integer NOT NULL, -- staff_alias.aid + gender gender NOT NULL DEFAULT 'unknown', + lang language NOT NULL DEFAULT 'ja', + "desc" text NOT NULL DEFAULT '', + l_wp varchar(150) NOT NULL DEFAULT '', + l_site varchar(250) NOT NULL DEFAULT '', + l_twitter varchar(16) NOT NULL DEFAULT '', + l_anidb integer +); + +-- staff_hist +CREATE TABLE staff_hist ( + chid integer NOT NULL PRIMARY KEY, + aid integer NOT NULL, -- Can't refer to staff_alias.id, because the alias might have been deleted + gender gender NOT NULL DEFAULT 'unknown', + lang language NOT NULL DEFAULT 'ja', + "desc" text NOT NULL DEFAULT '', + l_wp varchar(150) NOT NULL DEFAULT '', + l_site varchar(250) NOT NULL DEFAULT '', + l_twitter varchar(16) NOT NULL DEFAULT '', + l_anidb integer ); -- staff_alias CREATE TABLE staff_alias ( - id SERIAL NOT NULL, - rid integer, - name varchar(200) NOT NULL DEFAULT '', - original varchar(200) NOT NULL DEFAULT '', - PRIMARY KEY (id, rid) + id integer NOT NULL, + aid SERIAL PRIMARY KEY, -- Globally unique ID of this alias + name varchar(200) NOT NULL DEFAULT '', + original varchar(200) NOT NULL DEFAULT '' ); --- staff_rev -CREATE TABLE staff_rev ( - id integer NOT NULL PRIMARY KEY, - sid integer NOT NULL, - aid integer NOT NULL, - gender gender NOT NULL DEFAULT 'unknown', - lang language NOT NULL DEFAULT 'ja', - "desc" text NOT NULL DEFAULT '', - l_wp varchar(150) NOT NULL DEFAULT '', - l_site varchar(250) NOT NULL DEFAULT '', - l_twitter varchar(16) NOT NULL DEFAULT '', - l_anidb integer +-- staff_alias_hist +CREATE TABLE staff_alias_hist ( + chid integer NOT NULL, + aid integer NOT NULL, -- staff_alias.aid, but can't reference it because the alias may have been deleted + name varchar(200) NOT NULL DEFAULT '', + original varchar(200) NOT NULL DEFAULT '', + PRIMARY KEY(chid, aid) ); -- stats_cache @@ -427,78 +575,129 @@ CREATE TABLE users_prefs ( -- vn CREATE TABLE vn ( - id SERIAL NOT NULL PRIMARY KEY, - latest integer NOT NULL DEFAULT 0, - locked boolean NOT NULL DEFAULT FALSE, - hidden boolean NOT NULL DEFAULT FALSE, - rgraph integer, + id SERIAL PRIMARY KEY, + locked boolean NOT NULL DEFAULT FALSE, + hidden boolean NOT NULL DEFAULT FALSE, + title varchar(250) NOT NULL DEFAULT '', + original varchar(250) NOT NULL DEFAULT '', + alias varchar(500) NOT NULL DEFAULT '', + length smallint NOT NULL DEFAULT 0, + img_nsfw boolean NOT NULL DEFAULT FALSE, + image integer NOT NULL DEFAULT 0, + "desc" text NOT NULL DEFAULT '', + l_wp varchar(150) NOT NULL DEFAULT '', + l_encubed varchar(100) NOT NULL DEFAULT '', + l_renai varchar(100) NOT NULL DEFAULT '', + rgraph integer, -- relgraphs.id c_released integer NOT NULL DEFAULT 0, c_languages language[] NOT NULL DEFAULT '{}', + c_olang language[] NOT NULL DEFAULT '{}', c_platforms platform[] NOT NULL DEFAULT '{}', c_popularity real, - c_rating real, + c_rating real, c_votecount integer NOT NULL DEFAULT 0, - c_search text, - c_olang language[] NOT NULL DEFAULT '{}' + c_search text +); + +-- vn_hist +CREATE TABLE vn_hist ( + chid integer NOT NULL PRIMARY KEY, + title varchar(250) NOT NULL DEFAULT '', + original varchar(250) NOT NULL DEFAULT '', + alias varchar(500) NOT NULL DEFAULT '', + length smallint NOT NULL DEFAULT 0, + img_nsfw boolean NOT NULL DEFAULT FALSE, + image integer NOT NULL DEFAULT 0, + "desc" text NOT NULL DEFAULT '', + l_wp varchar(150) NOT NULL DEFAULT '', + l_encubed varchar(100) NOT NULL DEFAULT '', + l_renai varchar(100) NOT NULL DEFAULT '' ); -- vn_anime CREATE TABLE vn_anime ( - vid integer NOT NULL, - aid integer NOT NULL, - PRIMARY KEY(vid, aid) + id integer NOT NULL, + aid integer NOT NULL, -- anime.id + PRIMARY KEY(id, aid) +); + +-- vn_anime_hist +CREATE TABLE vn_anime_hist ( + chid integer NOT NULL, + aid integer NOT NULL, -- anime.id + PRIMARY KEY(chid, aid) ); -- vn_relations CREATE TABLE vn_relations ( - vid1 integer NOT NULL DEFAULT 0, - vid2 integer NOT NULL DEFAULT 0, - relation vn_relation NOT NULL, - official boolean NOT NULL DEFAULT TRUE, - PRIMARY KEY(vid1, vid2) + id integer NOT NULL, + vid integer NOT NULL, -- vn.id + relation vn_relation NOT NULL, + official boolean NOT NULL DEFAULT TRUE, + PRIMARY KEY(id, vid) ); --- vn_rev -CREATE TABLE vn_rev ( - id integer NOT NULL PRIMARY KEY, - vid integer NOT NULL DEFAULT 0, - title varchar(250) NOT NULL DEFAULT '', - alias varchar(500) NOT NULL DEFAULT '', - img_nsfw boolean NOT NULL DEFAULT FALSE, - length smallint NOT NULL DEFAULT 0, - "desc" text NOT NULL DEFAULT '', - l_wp varchar(150) NOT NULL DEFAULT '', - image integer NOT NULL DEFAULT 0, - l_encubed varchar(100) NOT NULL DEFAULT '', - l_renai varchar(100) NOT NULL DEFAULT '', - original varchar(250) NOT NULL DEFAULT '' +-- vn_relations_hist +CREATE TABLE vn_relations_hist ( + chid integer NOT NULL, + vid integer NOT NULL, -- vn.id + relation vn_relation NOT NULL, + official boolean NOT NULL DEFAULT TRUE, + PRIMARY KEY(chid, vid) ); -- vn_screenshots CREATE TABLE vn_screenshots ( - vid integer NOT NULL DEFAULT 0, - scr integer NOT NULL DEFAULT 0, - nsfw boolean NOT NULL DEFAULT FALSE, - rid integer, - PRIMARY KEY(vid, scr) + id integer NOT NULL, + scr integer NOT NULL, -- screenshots.id + rid integer, -- releases.id (only NULL for old revisions, nowadays not allowed anymore) + nsfw boolean NOT NULL DEFAULT FALSE, + PRIMARY KEY(id, scr) +); + +-- vn_screenshots_hist +CREATE TABLE vn_screenshots_hist ( + chid integer NOT NULL, + scr integer NOT NULL, + rid integer, + nsfw boolean NOT NULL DEFAULT FALSE, + PRIMARY KEY(chid, scr) ); -- vn_seiyuu CREATE TABLE vn_seiyuu ( - vid integer NOT NULL, - aid integer NOT NULL, - cid integer NOT NULL, - note varchar(250) NOT NULL DEFAULT '', - PRIMARY KEY (vid, aid, cid) + id integer NOT NULL, + aid integer NOT NULL, -- staff_alias.aid + cid integer NOT NULL, -- chars.id + note varchar(250) NOT NULL DEFAULT '', + PRIMARY KEY (id, aid, cid) +); + +-- vn_seiyuu_hist +CREATE TABLE vn_seiyuu_hist ( + chid integer NOT NULL, + aid integer NOT NULL, -- staff_alias.aid, but can't reference it because the alias may have been deleted + cid integer NOT NULL, -- chars.id + note varchar(250) NOT NULL DEFAULT '', + PRIMARY KEY (chid, aid, cid) ); -- vn_staff CREATE TABLE vn_staff ( - vid integer NOT NULL, - aid integer NOT NULL, - role credit_type NOT NULL DEFAULT 'staff', - note varchar(250) NOT NULL DEFAULT '', - PRIMARY KEY (vid, aid, role) + id integer NOT NULL, + aid integer NOT NULL, -- staff_alias.aid + role credit_type NOT NULL DEFAULT 'staff', + note varchar(250) NOT NULL DEFAULT '', + PRIMARY KEY (id, aid, role) +); + +-- vn_staff_hist +CREATE TABLE vn_staff_hist ( + chid integer NOT NULL, + aid integer NOT NULL, -- See note at vn_seiyuu_hist.aid + role credit_type NOT NULL DEFAULT 'staff', + note varchar(250) NOT NULL DEFAULT '', + PRIMARY KEY (chid, aid, role) ); -- vnlists |