-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.sql
More file actions
147 lines (117 loc) · 3.46 KB
/
schema.sql
File metadata and controls
147 lines (117 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
-- lookup tables
CREATE TABLE professions (
id SMALLINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE genres (
id SMALLINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE title_type (
id SMALLINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE principal_categories (
id SMALLINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
-- core tables
CREATE TABLE name_basics (
nconst TEXT PRIMARY KEY,
primary_name TEXT,
birth_year SMALLINT,
death_year SMALLINT
);
CREATE TABLE title_basics (
tconst TEXT PRIMARY KEY,
title_type_id SMALLINT NOT NULL,
primary_title TEXT NOT NULL,
original_title TEXT NOT NULL,
is_adult BOOLEAN NOT NULL,
start_year SMALLINT,
end_year SMALLINT,
runtime_minutes SMALLINT,
CONSTRAINT fk_title_type
FOREIGN KEY (title_type_id)
REFERENCES title_type (id)
);
CREATE TABLE title_ratings (
tconst TEXT PRIMARY KEY,
average_rating REAL,
num_votes INTEGER NOT NULL DEFAULT 0,
CONSTRAINT fk_ratings_title
FOREIGN KEY (tconst)
REFERENCES title_basics (tconst)
ON DELETE CASCADE
);
CREATE TABLE title_principals (
tconst TEXT NOT NULL,
ordering SMALLINT NOT NULL,
nconst TEXT NOT NULL,
category_id SMALLINT NOT NULL,
job TEXT,
characters TEXT[],
CONSTRAINT pk_title_principals
PRIMARY KEY (tconst, ordering),
CONSTRAINT fk_principals_title
FOREIGN KEY (tconst)
REFERENCES title_basics (tconst)
ON DELETE CASCADE,
CONSTRAINT fk_principals_name
FOREIGN KEY (nconst)
REFERENCES name_basics (nconst)
ON DELETE CASCADE,
CONSTRAINT fk_principals_category
FOREIGN KEY (category_id)
REFERENCES principal_categories (id)
);
-- junction tables
CREATE TABLE name_known_for_titles (
nconst TEXT NOT NULL,
tconst TEXT NOT NULL,
CONSTRAINT pk_known_for
PRIMARY KEY (nconst, tconst),
CONSTRAINT fk_known_for_name
FOREIGN KEY (nconst)
REFERENCES name_basics (nconst)
ON DELETE CASCADE,
CONSTRAINT fk_known_for_title
FOREIGN KEY (tconst)
REFERENCES title_basics (tconst)
ON DELETE CASCADE
);
CREATE TABLE name_primary_professions (
nconst TEXT NOT NULL,
profession_id SMALLINT NOT NULL,
CONSTRAINT pk_name_professions
PRIMARY KEY (nconst, profession_id),
CONSTRAINT fk_name_professions_name
FOREIGN KEY (nconst)
REFERENCES name_basics (nconst)
ON DELETE CASCADE,
CONSTRAINT fk_name_professions_profession
FOREIGN KEY (profession_id)
REFERENCES professions (id)
);
CREATE TABLE title_genres (
tconst TEXT NOT NULL,
genre_id SMALLINT NOT NULL,
CONSTRAINT pk_title_genres
PRIMARY KEY (tconst, genre_id),
CONSTRAINT fk_title_genres_title
FOREIGN KEY (tconst)
REFERENCES title_basics (tconst)
ON DELETE CASCADE,
CONSTRAINT fk_title_genres_genre
FOREIGN KEY (genre_id)
REFERENCES genres (id)
);
-- indexes
CREATE INDEX idx_title_principals_nconst
ON title_principals (nconst);
CREATE INDEX idx_title_principals_category
ON title_principals (category_id);
CREATE INDEX idx_title_genres_genre
ON title_genres (genre_id);
CREATE INDEX idx_name_primary_professions_profession
ON name_primary_professions (profession_id);