337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* ============================================================================= | ||
|  |  * PostgreSQL Schema - designs for a new HPR database | ||
|  |  * | ||
|  |  * File:        hpr_schema.pgsql | ||
|  |  * Created:     2017-03-15 | ||
|  |  * Updated:     2017-10-16 | ||
|  |  * ============================================================================= | ||
|  |  */ | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Drop everything to start with. The order is important because of the | ||
|  |  * relations between tables. Also, some items are dependent and go with the | ||
|  |  * tables. | ||
|  |  * ------------------------------------------------------------------------------ | ||
|  |  */ | ||
|  | DROP TABLE IF EXISTS comments CASCADE; | ||
|  | DROP TABLE IF EXISTS episodes CASCADE; | ||
|  | DROP TABLE IF EXISTS episodes_hosts_xref CASCADE; | ||
|  | DROP TABLE IF EXISTS episodes_series_xref CASCADE; | ||
|  | DROP TABLE IF EXISTS episodes_tags_xref CASCADE; | ||
|  | DROP TABLE IF EXISTS hosts CASCADE; | ||
|  | DROP TABLE IF EXISTS licenses CASCADE; | ||
|  | DROP TABLE IF EXISTS series CASCADE; | ||
|  | DROP TABLE IF EXISTS tags CASCADE; | ||
|  | 
 | ||
|  | --  DROP INDEX IF EXISTS episode_release_date_key; | ||
|  | 
 | ||
|  | DROP SEQUENCE IF EXISTS comment_seq; | ||
|  | DROP SEQUENCE IF EXISTS episode_seq; | ||
|  | DROP SEQUENCE IF EXISTS host_seq; | ||
|  | DROP SEQUENCE IF EXISTS license_seq; | ||
|  | DROP SEQUENCE IF EXISTS series_seq; | ||
|  | DROP SEQUENCE IF EXISTS tag_seq; | ||
|  | 
 | ||
|  | -- DROP VIEW IF EXISTS eht_view; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'licenses' - licenses relating to episodes (needed because 'hosts' | ||
|  |  * references it) | ||
|  |  * ------------------------------------------------------------------------------ | ||
|  |  */ | ||
|  | CREATE SEQUENCE license_seq; | ||
|  | 
 | ||
|  | ALTER TABLE license_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE licenses ( | ||
|  |     id                  integer default nextval('license_seq') PRIMARY KEY, | ||
|  |     short_name          varchar(11) NOT NULL UNIQUE, | ||
|  |     long_name           varchar(40) NOT NULL, | ||
|  |     url                 varchar(80) NOT NULL | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE licenses | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* | ||
|  |  * Load the table since it's quite short. Don't set the id to ensure the | ||
|  |  * sequence is updated properly. | ||
|  |  */ | ||
|  | INSERT INTO licenses (short_name, long_name, url) VALUES | ||
|  | ('CC-0', 'Public Domain Dedication', 'http://creativecommons.org/publicdomain/zero/1.0/'), | ||
|  | ('CC-BY', 'Attribution', 'http://creativecommons.org/licenses/by/4.0'), | ||
|  | ('CC-BY-SA', 'Attribution-ShareAlike', 'http://creativecommons.org/licenses/by-sa/3.0'), | ||
|  | ('CC-BY-ND', 'Attribution-NoDerivs', 'http://creativecommons.org/licenses/by-nd/4.0'), | ||
|  | ('CC-BY-NC', 'Attribution-NonCommercial', 'http://creativecommons.org/licenses/by-nc/4.0'), | ||
|  | ('CC-BY-NC-SA', 'Attribution-NonCommercial-ShareAlike', 'http://creativecommons.org/licenses/by-nc-sa/4.0'), | ||
|  | ('CC-BY-NC-ND', 'Attribution-NonCommercial-NoDerivs', 'http://creativecommons.org/licenses/by-nc-nd/4.0'); | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'episodes' - HPR shows | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE SEQUENCE episode_seq; | ||
|  | 
 | ||
|  | ALTER TABLE episode_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE episodes ( | ||
|  |     id                  integer default nextval('episode_seq') PRIMARY KEY, | ||
|  |     release_date        date NOT NULL, | ||
|  |     title               varchar(100) NOT NULL, | ||
|  |     summary             varchar(100), | ||
|  |     notes               text NOT NULL, | ||
|  |     explicit            smallint NOT NULL DEFAULT '1', | ||
|  |     license             varchar(11) NOT NULL DEFAULT 'CC-BY-SA' | ||
|  |                             REFERENCES licenses (short_name), | ||
|  |     duration            integer NOT NULL DEFAULT 0, | ||
|  |     downloads           integer NOT NULL DEFAULT 0 | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE episodes | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE INDEX episode_release_date_key | ||
|  |   ON episodes | ||
|  |   USING btree | ||
|  |   (release_date); | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'hosts' - hosts contributing shows | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE SEQUENCE host_seq; | ||
|  | 
 | ||
|  | ALTER TABLE host_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE hosts ( | ||
|  |     id                  integer default nextval('host_seq') PRIMARY KEY, | ||
|  |     host                varchar(1024) UNIQUE NOT NULL, | ||
|  | --  email               varchar(1024) CHECK (email <> ''), | ||
|  |     email               varchar(1024) UNIQUE NOT NULL, | ||
|  |     profile             text, | ||
|  |     license             varchar(11) NOT NULL DEFAULT 'CC-BY-SA' | ||
|  |                             REFERENCES licenses (short_name), | ||
|  |     local_image         smallint NOT NULL DEFAULT '0', | ||
|  |     gpg                 text, | ||
|  |     valid               smallint NOT NULL DEFAULT '1', | ||
|  |     date_added          date | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE hosts | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'episodes_hosts_xref' - joining table between 'episodes' and 'hosts' | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE TABLE episodes_hosts_xref ( | ||
|  |     episodes_id         integer REFERENCES episodes(id) | ||
|  |                                 ON DELETE RESTRICT, | ||
|  |     hosts_id            integer REFERENCES hosts(id) | ||
|  |                                 ON DELETE CASCADE, | ||
|  |                         PRIMARY KEY (episodes_id, hosts_id) | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE episodes_hosts_xref | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'tags' - tags relating to episodes | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE SEQUENCE tag_seq; | ||
|  | 
 | ||
|  | ALTER TABLE tag_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE tags ( | ||
|  |     id                  integer default nextval('tag_seq') PRIMARY KEY, | ||
|  |     tag                 varchar(1024) NOT NULL | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE tags | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'episodes_tags_xref' - joining table between 'episodes' and 'tags' | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE TABLE episodes_tags_xref ( | ||
|  |     episodes_id         integer REFERENCES episodes(id) | ||
|  |                             ON DELETE RESTRICT, | ||
|  |     tags_id             integer REFERENCES tags(id) | ||
|  |                             ON DELETE CASCADE, | ||
|  |                         PRIMARY KEY (episodes_id, tags_id) | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE episodes_tags_xref | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'series' - series grouping for episodes | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE SEQUENCE series_seq; | ||
|  | 
 | ||
|  | ALTER TABLE series_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE series ( | ||
|  |     id                  integer default nextval('series_seq') PRIMARY KEY, | ||
|  |     name                varchar(100) NOT NULL, | ||
|  |     description         text NOT NULL, | ||
|  |     private             smallint NOT NULL DEFAULT '0', | ||
|  |     image               text, | ||
|  |     valid               smallint NOT NULL DEFAULT '1' | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE series | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'episodes_series_xref' - joining table between 'episodes' and 'series' | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE TABLE episodes_series_xref ( | ||
|  |     episodes_id         integer REFERENCES episodes(id) | ||
|  |                             ON DELETE RESTRICT, | ||
|  |     series_id           integer REFERENCES series(id) | ||
|  |                             ON DELETE CASCADE, | ||
|  |                         PRIMARY KEY (episodes_id, series_id) | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE episodes_series_xref | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Table 'comments' - comments relating to episodes | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE SEQUENCE comment_seq; | ||
|  | 
 | ||
|  | ALTER TABLE comment_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE comments ( | ||
|  |     id                  integer default nextval('comment_seq') PRIMARY KEY, | ||
|  |     eps_id              integer REFERENCES episodes(id) | ||
|  |                             ON DELETE RESTRICT, | ||
|  |     comment_timestamp   timestamp without time zone NOT NULL, | ||
|  |     comment_author_name varchar(1024), | ||
|  |     comment_title       varchar(1024), | ||
|  |     comment_text        text, | ||
|  |     last_changed        timestamp without time zone NOT NULL | ||
|  |                             DEFAULT timezone('UTC'::text, now()) | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE comments | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Tables from "Today with a Techie" for further processing | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | CREATE SEQUENCE twat_hosts_seq; | ||
|  | 
 | ||
|  | ALTER TABLE twat_hosts_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE twat_hosts ( | ||
|  |     id                  integer default nextval('twat_hosts_seq') PRIMARY KEY, | ||
|  |     host                varchar(1024) NOT NULL, | ||
|  |     email               varchar(1024), | ||
|  |     website             varchar(1024), | ||
|  |     repeat              integer NOT NULL | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE twat_hosts | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | 
 | ||
|  | CREATE SEQUENCE twat_episodes_seq; | ||
|  | 
 | ||
|  | ALTER TABLE twat_episodes_seq | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | CREATE TABLE twat_episodes ( | ||
|  |     ep_num              integer default nextval('twat_episodes_seq') PRIMARY KEY, | ||
|  |     date                integer NOT NULL, | ||
|  |     host                varchar(1024) NOT NULL, | ||
|  |     topic               varchar(1024) NOT NULL, | ||
|  |     writeup             text, | ||
|  |     url                 varchar(1024) NOT NULL | ||
|  | ); | ||
|  | 
 | ||
|  | ALTER TABLE twat_episodes | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | /* ------------------------------------------------------------------------------ | ||
|  |  * Experimental views | ||
|  |  * ------------------------------------------------------------------------------ */ | ||
|  | -- | ||
|  | -- eh_view | ||
|  | -- | ||
|  | CREATE OR REPLACE VIEW eh_view AS | ||
|  | SELECT | ||
|  |     ep.id, | ||
|  |     ep.release_date, | ||
|  |     ep.title, | ||
|  |     (SELECT string_agg(host, ', ' ORDER BY host) | ||
|  |         FROM hosts h2, | ||
|  |              episodes_hosts_xref eh2 | ||
|  |         WHERE eh2.hosts_id = h2.id | ||
|  |         GROUP BY eh2.episodes_id | ||
|  |         HAVING eh2.episodes_id = ep.id) AS hosts | ||
|  | FROM episodes ep | ||
|  | GROUP BY ep.id | ||
|  | ORDER BY ep.id; | ||
|  | 
 | ||
|  | ALTER TABLE eh_view | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | -- | ||
|  | -- eht_view | ||
|  | -- | ||
|  | CREATE OR REPLACE VIEW eht_view AS | ||
|  | SELECT  e.*, | ||
|  |         h.host, | ||
|  |         t.tag, | ||
|  |         (SELECT string_agg(tag, ', ') | ||
|  |             FROM tags t2, | ||
|  |                     episodes_tags_xref et2 | ||
|  |             WHERE et2.tags_id = t2.id | ||
|  |             GROUP BY et2.episodes_id | ||
|  |             HAVING et2.episodes_id = e.id) AS tags | ||
|  | FROM episodes e, | ||
|  |      hosts h, | ||
|  |      episodes_hosts_xref eh, | ||
|  |      episodes_tags_xref et, | ||
|  |      tags t | ||
|  | WHERE e.id = eh.episodes_id | ||
|  |   AND h.id = eh.hosts_id | ||
|  |   AND e.id = et.episodes_id | ||
|  |   AND et.tags_id = t.id | ||
|  | GROUP BY e.id, | ||
|  |          h.host, | ||
|  |          t.tag | ||
|  | ORDER BY e.id; | ||
|  | 
 | ||
|  | --  CREATE OR REPLACE VIEW eht_view AS | ||
|  | --  SELECT | ||
|  | --  e.*, | ||
|  | --  h.host, | ||
|  | --  t.tag, | ||
|  | --  (SELECT string_agg(tag, ', ') | ||
|  |     --  FROM tags t2, episodes_tags_xref et2 | ||
|  |     --  WHERE et2.tags_id = t2.id | ||
|  |     --  GROUP BY et2.episodes_id | ||
|  |     --  HAVING et2.episodes_id = e.id) AS tags | ||
|  | --  FROM episodes e, hosts h, episodes_hosts_xref eh, episodes_tags_xref et, tags t | ||
|  | --  WHERE e.id = eh.episodes_id | ||
|  | --  AND h.id = eh.hosts_id | ||
|  | --  AND e.id = et.episodes_id | ||
|  | --  AND et.tags_id = t.id | ||
|  | --  GROUP BY e.id,h.host,t.tag | ||
|  | --  ORDER BY e.id; | ||
|  | 
 | ||
|  | ALTER TABLE eht_view | ||
|  |   OWNER TO hpradmin; | ||
|  | 
 | ||
|  | -- Footer --------------------------------------------------------------------- | ||
|  | 
 | ||
|  | -- vim: syntax=pgsql:ts=8:sw=4:ai:tw=78:et:fo=tcrqn21:nu:rnu |