vuoi
o PayPal
tutte le volte che vuoi
CONCETTO COSTRUTTO ACCESSI
Infrastruttura E 1Composizione R 1Villaggio E 1senza ridondanza
CONCETTO COSTRUTTO ACCESSIInfrastruttura E 1Operazione 1con ridondanza
CONCETTO COSTRUTTO ACCESSIUtente E 1Proprietà R 1Villaggio E 1Composizione R 18Infrastruttura E 18Villaggio E 18senza ridondanza
CONCETTO COSTRUTTO ACCESSIUtente E 1Possiede R 1Villaggio E 1Composto R 18Infrastruttura E 18Operazione 8con ridondanza
CONCETTO COSTRUTTO ACCESSIUtente E 1Villaggio E 1senza ridondanza
CONCETTO COSTRUTTO ACCESSIUtente E 1Villaggio E 1Composizione R 39Infrastruttura E 39
Con ridondanza il numero di accessi è molto inferiore. L'occupazione di memoria aggiuntiva dovuta al dato ridondante è minima (4b * 100.000 =~ 400kb), dunque in questo caso conviene mantenere tale dato.
Eliminazione delle generalizzazioni Infrastruttura Nella generalizzazione si possono accorpare le entità figlie nell’entità padre data Magazzino, l’assenza di attributi specifici, eccetto i cui
attributi passano al padre. In questo modo si risparmia spazio dato che in c'è l'attributo che le identifica.
TipoTruppa Stessa cosa è stata effettuata con la generalizzazione, accorpando le entità figlie nel padre che ha già tutti gli attributi necessari a identificarle.
Partizionamenti e Accorpamenti Infrastruttura
Eseguiamo un partizionamento verticale sull'entità Tipo Infrastruttura. Questo tipo di partizionamento opera sugli attributi. Infatti, l'attributo ha valori ben definiti (tra le tipologie indicate nelle specifiche), così come i valori di moltiplicazione per il passaggio di livello che variano in base al tipo. Essi non verranno mai modificati una volta creata una data infrastruttura. Per questo motivo dedichiamo all'insieme di questi valori un'entità specifica, che andrà poi a caratterizzare, tramite una relazione, ogni singola infrastruttura.
presente in un villaggio. In questo modo l'entità perde l'attributo Tipo Funzione TipoInfrastruttura e viene collegata tramite la nuova relazione all'entità Infrastruttura. Questo tipo di Eseguiamo inoltre un partizionamento orizzontale sull'entità Infrastrutturapartizionamento opera sulle occorrenze dell'entità. Notiamo, infatti, che l'entità ,dopo l'eliminazione della generalizzazione, ha acquisito gli attributi che erano presentiMagazzinonell'entità figlia (grano, legno, argilla, ferro). Questi attributi comparirebbero quindi per ogni infrastruttura, non solo per i magazzini. Ciò porterebbe ad avere quattro campi nulli perInfrastrutturatante occorrenze dell'entità . Pertanto, decidiamo di dedicare ai magazziniMagazzino. Infrastrutturaun'entità a parte, chiamata L'entità perde quindi gli attributi grano, legno, ferro e argilla che vanno invece alla
nuova entità, la quale non presenta l'attributo tipoInfrastruttura. Trattandosi (poiché si tratta di soli magazzini) mentre conserva gli altri attributi didi un partizionamento orizzontale dobbiamo duplicare tutte le associazione a cui l'entità Magazzino Villaggio Riserve originaria partecipava: colleghiamo all'entità tramite la relazione eTipoInfrastruttura Requisiti all'entità tramite la relazione.
Dizionario dei dati
ENTITÀ DESCRIZIONE ATTRIBUTI IDENTIFICATORE
Nickname, Nome utente, NicknameGiocatore L'utente del gioco password, sesso, età, data di nascita
Villaggio Villaggio controllato da un Nome, x, y, abitanti Nomegiocatore
Infrastruttura Costruzione appartenente a ID, livello, dataora IDun villaggio
TipoInfrastruttura Tipologie di infrastruttura Nome, g_up, a_up, f_up, Nomel_up
Magazzino Infrastruttura dedicata a ID, livello, dataora, IDcontenere risorse grano, argilla, ferro,legno
TipoTruppa Tipologie di
- unità militare
- Tipo, attacco, difesa, Tipog_up, a_up, f_up, l_up
- Combattimento
- Attacco militare da un ID, dataora IDvillaggio ad un altro
RELAZIONE
DESCRIZIONE ENTITÀ COINVOLTE ATTRIBUTI
- Proprietà
- Associa uno o più villaggi a Giocatore (0,N), un giocatore Villaggio (1,1)
- Composizione
- Associa un'infrastruttura a Villaggio (1,N), un villaggio Infrastruttura (1,1)
- Funzione
- Associa una tipologia ad Infrastruttura (1,1), un'infrastruttura TipoInfrastruttura (0,N)
- Attaccante
- Associa il villaggio che sferra l'attacco al combattimento Combattimento (1,1), corrispondente TipoTruppa (0,N)
- Difensore
- Associa il villaggio che subisce l'attacco al combattimento Combattimento (1,1), corrispondente TipoTruppa (0,N)
- Truppe
- Associa truppe ad un TipoTruppa (0,N), Quantità villaggio Villaggio (0,N)
- Riserve
- Associa un magazzino ad un villaggio Magazzino (1,1)
- Requisiti
- Associa un...
magazzino Magazzino (1,1),all'entità creata per TipoInfrastruttura (0,N)conservare le informazioni sulle infrastrutture
Schema logico dei vincoli di integrità referenziale
Schema relazionale
Giocatore {Nickname,Nome,Password,Residenza,Sesso,Data di Nascita}
Villaggio {Nome,Abitanti,X,Y,Proprietario (referenza Giocatore(Nick))}
Combattimento {Id,DataOra,Attaccante, (referenza Villaggio(Nome))Tipo_a, (referenza TipoTruppa(Nome))Impiegate_a,Perse_a,Difensore, (referenza Villaggio(Nome))Tipo_d, (referenza TipoTruppa(Nome))Impiegate_d,Perse_d}
Truppe {Tipo, (referenza TipoTruppa(Nome))Villaggio, (referenza Villaggio(Nome))Quantità}
TipoTruppa {Nome,Attacco,Difesa,G_up,A_up,F_up,L_up}
Magazzino {Id,Livello,DataOra,Argilla,Ferro,Grano,Legno,Villaggio (referenza Villaggio(Nome))}
Infrastruttura {Id,Tipo (referenza TipoInfrastruttura(Nome))Livello,DataOra,Villaggio, (referenza Villaggio(Nome))}
TipoInfrastruttura {Nome,G_up,A_up,F_up,L_up}
CODICE SQL
Per tutte le operazioni con
Il codice SQL è stata utilizzata la piattaforma MySQL. Query per la creazione del database: ```html
CREATE TABLE giocatore(
nick VARCHAR(30) NOT NULL,
nome VARCHAR(30) NOT NULL,
password VARCHAR(20) NOT NULL,
residenza VARCHAR(255) NOT NULL,
sesso CHAR(1) NOT NULL check (sesso = 'm' or sesso = 'f'),
data_nascita DATE NOT NULL,
PRIMARY KEY (nick)
);
CREATE TABLE villaggio(
nome VARCHAR(20) NOT NULL,
abitanti INTEGER DEFAULT 95 NOT NULL,
x INTEGER(3) NOT NULL check (x >= -375 or x <= 375),
y INTEGER(3) NOT NULL check (y >= -375 or y <= 375),
proprietario VARCHAR(30) NOT NULL REFERENCES giocatore(nick) ON UPDATE CASCADE,
PRIMARY KEY (nome),
CONSTRAINT posizione unique(x,y)
);
CREATE TABLE combattimento(
id INTEGER NOT NULL AUTO_INCREMENT,
dataora TIMESTAMP DEFAULT NOW(),
attaccante VARCHAR(20) NOT NULL REFERENCES villaggio(nome) ON UPDATE CASCADE,
tipo_a VARCHAR(255) NOT NULL REFERENCES tipotruppa(nome) ON UPDATE CASCADE,
impiegate_a INTEGER NOT NULL check (impiegate_a >=
```0),perse_a INTEGER NOT NULL check (perse_a <= impiegate_a), difensore VARCHAR(20) NOT NULL REFERENCES villaggio(nome) ON UPDATE CASCADE, tipo_d VARCHAR(255) NOT NULL REFERENCES tipotruppa(nome) ON UPDATE CASCADE, impiegate_d INTEGER NOT NULL check (impiegate_d >= 0), perse_d INTEGER NOT NULL check (perse_d <= impiegate_d), PRIMARY KEY (id) ); CREATE TABLE magazzino( id INTEGER NOT NULL AUTO_INCREMENT, livello INTEGER NOT NULL DEFAULT 1, dataora TIMESTAMP DEFAULT NOW(), argilla INTEGER NOT NULL check (argilla >= 0), ferro INTEGER NOT NULL check (ferro >= 0), grano INTEGER NOT NULL check (grano >= 0), legno INTEGER NOT NULL check (legno >= 0), villaggio VARCHAR(20) NOT NULL REFERENCES villaggio(nome) ON UPDATE CASCADE, PRIMARY KEY (id) ); CREATE TABLE tipotruppa( nome VARCHAR(255) NOT NULL, attacco INTEGER NOT NULL, difesa INTEGER NOT NULL, a_up INTEGER NOT NULL, f_up INTEGER NOT NULL, g_up INTEGER NOT NULL, l_up INTEGER NOT NULL, PRIMARY KEY (nome) ); CREATE TABLE tipoinfrastruttura( nome
CREATE TABLE tabella1 (
VARCHAR(255) NOT NULL,
a_up INTEGER NOT NULL,
f_up INTEGER NOT NULL,
g_up INTEGER NOT NULL,
l_up INTEGER NOT NULL,
PRIMARY KEY (nome)
);
CREATE TABLE infrastruttura (
id INTEGER NOT NULL AUTO_INCREMENT,
livello INTEGER NOT NULL DEFAULT 1,
dataora TIMESTAMP DEFAULT NOW(),
villaggio VARCHAR(20) NOT NULL REFERENCES villaggio(nome) ON UPDATE CASCADE,
tipo VARCHAR(255) NOT NULL REFERENCES tipoinfrastruttura(nome) ON UPDATE CASCADE,
PRIMARY KEY (id)
);
CREATE TABLE truppe (
villaggio VARCHAR(20) NOT NULL REFERENCES villaggio(nome) ON UPDATE CASCADE,
quantità INTEGER NOT NULL check (quantità >= 0),
tipo VARCHAR(255) REFERENCES truppa(tipo) ON UPDATE CASCADE,
PRIMARY KEY (villaggio,tipo)
);
Query di inizializzazione
INSERT INTO tipoinfrastruttura (nome,a_up,g_up,f_up,l_up)
VALUES('centro_città',100,200,400,400),('municipio',100,400,200,400),('granaio',200,200,200,400),('magazzino',200,200,200,500),('forno',100,200,400,400),('fabbro',100,200,200,200),('mercato',50,100,100,200),('campo_grano',100,100,100,100),('miniera_argilla',100,0,400,100),('miniera_ferro',100,0,400,200),('foresta',100,50,0,100),('caserma',200,200,400,400),('scuderia',100,50,200,400),('armeria',100,50,300,300),('arena',100,50,300,500),('castello',300,200,500,500);
INSERT INTO tipotruppa (nome,attacco,difesa,a_up,f_up,g_up,l_up)VALUES('legionario',10,20,50,50,50,50),('pretoriano',20,20,50,50,75,50),('imperiano',40,30,75,50,100,50),('legionario_cavallo',40,60,100,75,150,75),('imperiano_cavallo',80,80,100,75,175,75),('catapulta',200,200,100,0,500,500),('ariete',150,150,100,0,350,500);
Operazioni richieste nelle specifiche
Operazione 1: Registrare un nuovo utente e la creazione di un nuovo villa