-
Notifications
You must be signed in to change notification settings - Fork 0
/
criar.sql
228 lines (204 loc) · 7.74 KB
/
criar.sql
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
.headers on
.mode columns
PRAGMA foreign_keys = ON;
DROP TABLE IF EXISTS Localizacao;
DROP TABLE IF EXISTS Candidatura;
DROP TABLE IF EXISTS OfertaEmprego;
DROP TABLE IF EXISTS Empresa;
DROP TABLE IF EXISTS Participacao;
DROP TABLE IF EXISTS Contribuicao;
DROP TABLE IF EXISTS ProblemaAula;
DROP TABLE IF EXISTS ProblemaComSolucaoAula;
DROP TABLE IF EXISTS ProblemaCompeticao;
DROP TABLE IF EXISTS ProblemaDesafio;
DROP TABLE IF EXISTS Competicao;
DROP TABLE IF EXISTS Organizador;
DROP TABLE IF EXISTS ProblemaComSolucao;
DROP TABLE IF EXISTS Problema;
DROP TABLE IF EXISTS Informacao;
DROP TABLE IF EXISTS Desafio;
DROP TABLE IF EXISTS Aula;
DROP TABLE IF EXISTS Curso;
DROP TABLE IF EXISTS Mensagem;
DROP TABLE IF EXISTS Jogador;
DROP TABLE IF EXISTS Utilizador;
CREATE TABLE Utilizador (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
nome TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
CONSTRAINT emailFormato CHECK(email LIKE "%@%.%"),
ultimoLogin INTEGER NOT NULL
CONSTRAINT ultimoLoginNaoFuturo CHECK (ultimoLogin <= strftime("%s", CURRENT_TIMESTAMP))
);
CREATE TABLE Jogador (
id INTEGER PRIMARY KEY REFERENCES Utilizador(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
rating INTEGER CONSTRAINT ratingPositivo CHECK (rating >= 0), -- Derived attribute
numCompeticoes INTEGER CONSTRAINT numCompeticoesPositivo CHECK (numCompeticoes >= 0) -- Derived attribute
);
CREATE TABLE Empresa (
id INTEGER PRIMARY KEY REFERENCES Utilizador(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
website TEXT
CONSTRAINT websiteFormato CHECK(website LIKE "%.%"),
numeroTelefone INTEGER NOT NULL
);
CREATE TABLE Organizador (
id INTEGER PRIMARY KEY REFERENCES Jogador(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
pontosContribuicao INTEGER NOT NULL DEFAULT 0
CONSTRAINT pontosContribuicaoPositivos CHECK (pontosContribuicao >= 0)
);
CREATE TABLE Mensagem (
id INTEGER PRIMARY KEY,
idUtilizadorRemetente INTEGER NOT NULL REFERENCES Utilizador(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
idUtilizadorDestinatario INTEGER NOT NULL REFERENCES Utilizador(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
texto TEXT NOT NULL,
datetime INTEGER NOT NULL
CONSTRAINT datetimeNaoFutura CHECK (datetime <= strftime("%s", CURRENT_TIMESTAMP))
);
CREATE TABLE Localizacao (
pais TEXT NOT NULL,
cidade TEXT NOT NULL,
endereco TEXT NOT NULL,
PRIMARY KEY(pais, cidade, endereco)
);
CREATE TABLE OfertaEmprego (
id INTEGER PRIMARY KEY,
posicao TEXT NOT NULL,
informacao TEXT,
salario REAL CONSTRAINT salarioPositivo CHECK(salario>=0),
dataCriacao INTEGER NOT NULL
CONSTRAINT dataCriacaoNaoFutura CHECK (dataCriacao <= strftime("%s", CURRENT_TIMESTAMP)),
idEmpresa INTEGER NOT NULL REFERENCES Empresa(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
localPais TEXT,
localCidade TEXT,
localEndereco TEXT,
CONSTRAINT localCompletaOuNula CHECK(
((localPais IS NULL) = (localCidade IS NULL)) AND
((localCidade IS NULL) = (localEndereco IS NULL)) AND
((localPais IS NULL) = (localEndereco IS NULL))
),
FOREIGN KEY(localPais, localCidade, localEndereco) REFERENCES Localizacao(pais,cidade,endereco)
ON DELETE SET NULL ON UPDATE CASCADE
);
CREATE TABLE Candidatura(
idOferta INTEGER REFERENCES OfertaEmprego(id)
ON DELETE CASCADE ON UPDATE CASCADE,
idJogador INTEGER REFERENCES Jogador(id)
ON DELETE CASCADE ON UPDATE CASCADE,
dataCandidatura INTEGER NOT NULL
CONSTRAINT dataCandidaturaNaoFutura CHECK (dataCandidatura <= strftime("%s", CURRENT_TIMESTAMP)),
PRIMARY KEY(idOferta, idJogador)
);
CREATE TABLE Competicao(
id INTEGER PRIMARY KEY,
titulo TEXT NOT NULL,
descricao TEXT,
dificuldadeMedia REAL DEFAULT 0.0 -- Derived Attribute
CONSTRAINT dificuldadeMediaIntervalo CHECK(dificuldadeMedia >= 0 AND dificuldadeMedia <= 10),
datetimeInicio INTEGER NOT NULL,
datetimeFim INTEGER NOT NULL,
numParticipantes INTEGER DEFAULT 0, -- Derived Attribute
premio TEXT, -- 'Descrição do prémio'
CONSTRAINT integridadeTemporal CHECK(datetimeFim > datetimeInicio)
);
CREATE TABLE Participacao(
idJogador INTEGER REFERENCES Jogador(id)
ON DELETE CASCADE ON UPDATE CASCADE,
idCompeticao INTEGER REFERENCES Competicao(id)
ON DELETE CASCADE ON UPDATE CASCADE,
dataInscricao INTEGER NOT NULL
CONSTRAINT dataInscricaoNaoFutura CHECK (dataInscricao <= strftime("%s", CURRENT_TIMESTAMP)),
posicao INTEGER
CONSTRAINT posicaoMaiorQueZero CHECK(posicao >= 1),
mudancaRating INTEGER,
PRIMARY KEY(idJogador, idCompeticao)
);
CREATE TABLE Contribuicao(
idOrganizador INTEGER REFERENCES Organizador(id)
ON DELETE CASCADE ON UPDATE CASCADE,
idCompeticao INTEGER REFERENCES Competicao(id)
ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(idOrganizador, idCompeticao)
);
CREATE TABLE Curso (
id INTEGER PRIMARY KEY,
titulo TEXT NOT NULL,
descricao TEXT,
nivel TEXT CONSTRAINT nivelTipo CHECK (nivel IN ("Iniciante", "Medio", "Avancado")),
preco INTEGER CONSTRAINT precoPositivo CHECK (preco >= 0)
);
CREATE TABLE Problema (
id INTEGER PRIMARY KEY,
titulo TEXT NOT NULL,
descricao TEXT NOT NULL,
dificuldade INTEGER NOT NULL,
CONSTRAINT dificuldadeIntervalo CHECK (dificuldade >= 0 AND dificuldade <= 10)
);
CREATE TABLE Informacao (
idCurso INTEGER REFERENCES Curso(id)
ON DELETE RESTRICT ON UPDATE CASCADE, -- ON DELETE RESTRICT evita perda acidental de notas dos alunos/jogadores do curso
idJogador INTEGER REFERENCES Jogador(id)
ON DELETE CASCADE ON UPDATE CASCADE,
dataInicio INTEGER NOT NULL,
dataFim INTEGER NOT NULL,
nota INTEGER CONSTRAINT notaIntervalo CHECK (nota >= 0 AND nota <= 20),
PRIMARY KEY(idCurso, idJogador),
CONSTRAINT integridadeTemporal CHECK(dataFim > dataInicio)
);
CREATE TABLE Aula (
id INTEGER PRIMARY KEY,
texto TEXT,
videoURL TEXT
CONSTRAINT videoURLFormato CHECK(videoURL LIKE "%.%"),
idCurso INTEGER NOT NULL REFERENCES Curso(id)
ON DELETE CASCADE ON UPDATE CASCADE, -- Aula não pode existir sem um curso
CONSTRAINT aulaTemConteudo CHECK(texto IS NOT NULL OR videoURL IS NOT NULL)
);
CREATE TABLE ProblemaComSolucao (
idProblema INTEGER PRIMARY KEY REFERENCES Problema(id)
ON DELETE CASCADE ON UPDATE CASCADE,
solucao TEXT NOT NULL
);
CREATE TABLE Desafio (
id INTEGER PRIMARY KEY,
idDesafiador INTEGER NOT NULL REFERENCES Jogador(id)
ON DELETE CASCADE ON UPDATE CASCADE,
idDesafiado INTEGER NOT NULL REFERENCES Jogador(id)
ON DELETE CASCADE ON UPDATE CASCADE,
descricao TEXT NOT NULL
);
CREATE TABLE ProblemaCompeticao (
idProblema REFERENCES Problema(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
idCompeticao REFERENCES Competicao(id)
ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(idProblema, idCompeticao)
);
CREATE TABLE ProblemaAula (
idProblema REFERENCES Problema(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
idAula REFERENCES Aula(id)
ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(idProblema, idAula)
);
-- Adicionado para a 3ª entrega
CREATE TABLE ProblemaComSolucaoAula (
idProblemaComSolucao REFERENCES ProblemaComSolucao(idProblema)
ON DELETE RESTRICT ON UPDATE CASCADE,
idAula REFERENCES Aula(id)
ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(idProblemaComSolucao, idAula)
);
CREATE TABLE ProblemaDesafio (
idProblema REFERENCES Problema(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
idDesafio REFERENCES Desafio(id)
ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY(idProblema, idDesafio)
);