Modello Entità-Relazione

Modello ER

Il database è stato progettato in modo di essere il più possibile flessibile e di poter cambiare ogni singolo campo a proprio piacimento, mantenendo però l'integrità semantica dei dati.

Per come i dati sono interpretati dall'applicazione, consultare il Modello Dati

Struttura

Company

Modello Logico

Campo Descrizione
id Un ID associato ad ogni azienda. Servirà da chiave primaria e sarà un intero. Le aziende vengono identificate da questo ID e non dal loro nome per essere coerenti con il resto delle entità.
name Il nome dell'azienda. È inserito nella tabella Company e non nella tabella CompanyField perché è l'unico campo obbligatorio e che non può essere nullo.

Modello Fisico

CREATE TABLE Company (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  PRIMARY KEY(id),
  UNIQUE(name),
)

CompanyField

Modello Logico

Campo Descrizione
company L'ID dell'azienda a cui appartiene il campo. Chiave esterna a Company(id).
field L'ID del tipo di campo in questione. Chiave esterna a Field(id).
value Il valore del campo.

Modello Fisico

CREATE TABLE CompanyField (
  company INT NOT NULL,
  field INT NOT NULL,
  value VARCHAR(255) NOT NULL,
  PRIMARY KEY(company, field),
  FOREIGN KEY (company) REFERENCES Company(id) ON DELETE CASCADE,
  FOREIGN KEY (field) REFERENCES Field(id) ON DELETE CASCADE
)

Field

Questa tabella è necessaria per garantire un'integrità semantica non presente in un database SQL. Si possono inserire nuovi campi a proprio piacimento, con una sintassi inventata, senza modificare la struttura del database. Tutti i controlli verranno fatti a livello applicativo.

Un altro motivo di questa scelta è di avere consistenza nel database: visto che le colonne sono dinamiche e potrebbero essere cambiate continuamente, modificare la struttura delle tabelle potrebbe rivelarsi scomodo. Lo svantaggio di questo sistema è che, per applicare più di un filtro, sono necessarie più JOIN, ma visto che il database da gestire non è molto grande lo si può permettere.

Modello Logico

Campo Descrizione
id Un ID numerico associato ad ogni campo.
name Il nome del campo.
regex La sintassi che un valore di questo campo deve seguire per essere considerato valido.

Modello Fisico

CREATE TABLE Field (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  regex VARCHAR(255) NOT NULL,
  PRIMARY KEY(id),
  UNIQUE(name)
)

Saved

Modello Logico

Campo Descrizione
student Lo studente che si è salvato l'azienda. Corrisponde con l'ID utente di Spaggiari.
company L'azienda salvata.

Modello Fisico

CREATE TABLE Saved (
  student INT NOT NULL,
  company INT NOT NULL,
  PRIMARY KEY (student, company),
  FOREIGN KEY (company) REFERENCES Company(id) ON DELETE CASCADE,
  FOREIGN KEY (student) REFERENCES User(id) ON DELETE CASCADE
)

User

Modello Logico

Campo Descrizione
student Lo studente che si è salvato l'azienda. Corrisponde con l'ID utente di Spaggiari.
name Il nome dell'utente.
surname Il cognome dell'utente.
status Se l'utente è studente, docente, ...

Modello Fisico

CREATE TABLE User (
  id INT NOT NULL,
  name VARCHAR(128) NOT NULL,
  surname VARCHAR(128) NOT NULL,
  status VARCHAR(32) NOT NULL,
  PRIMARY KEY (id)
)

Privilege

Modello Logico

Campo Descrizione
id L'ID dell'utente. Corrisponde con l'ID utente di Spaggiari.
type Il tipo di permesso dato all'utente.

Modello Fisico

CREATE TABLE Privilege (
  user INT NOT NULL,
  type VARCHAR(16) NOT NULL,
  PRIMARY KEY(id, type),
  FOREIGN KEY (user) REFERENCES User(id) ON DELETE CASCADE
)

Internship

Per limitazioni tecniche, non si può inserire l'ID di Spaggiari nel campo student. Un utente che non è ma entrato nell'applicazione, e quindi dall'ID ignoto, potrebbe comunque essere uno stagista.

Modello Logico

Campo Descrizione
student Lo studente che sta svolgendo l'attività.
activity L'attività svolta dall'utente.
company L'azienda che ospita lo studente.
year L'anno in cui si è svolta questa attività.

Modello Fisico

CREATE TABLE Internship (
  id INT NOT NULL AUTO_INCREMENT,
  student VARCHAR(255) NOT NULL,
  activity INT NOT NULL,
  company INT NOT NULL,
  year INT NOT NULL,
  PRIMARY KEY (id),
  UNIQUE (student, activity, company, year),
  FOREIGN KEY (activity) REFERENCES Activity(id) ON DELETE CASCADE,
  FOREIGN KEY (company) REFERENCES Company(id) ON DELETE CASCADE
)

Activity

Modello Logico

Campo Descrizione
id Un ID associato ad ogni attività.
name Il nome dell'attività.
description La descrizione dell'attività.

Modello Fisico

CREATE TABLE Activity (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  description VARCHAR(255) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE (name)
)

Tag

Modello Logico

Campo Descrizione
company L'ID dell'azienda a cui è associato il tag.
tag Il tag in sè.

Modello Fisico

CREATE TABLE Tag (
  company INT NOT NULL AUTO_INCREMENT,
  tag VARCHAR(255) NOT NULL,
  FOREIGN KEY (company) REFERENCES Company(id),
  PRIMARY KEY (id, tag),
)