Nelle lezioni precedenti, sono stati introdotti i fondamenti del modello a oggetti di OrientDB, basato su record, classi e
cluster. Abbiamo visto come creare una classe in SQL, e in questa lezione approfondiremo i comandi relativi alla gestione di classi e cluster in SQL.
Definizione di classi
In OrientDB, come nella programmazione a oggetti, le classo rappresentano informazioni di alto livello, costituite dall'aggregazione di più dati. Supponiamo che nel nostro sistema informativo un oggetto di classe Persona abbia le proprietà nome, cognome ed eta, dove i primi due sono tipi String
, il terzo è un intero:
CREATE CLASS Persona
CREATE PROPERTY Persona.nome String
CREATE PROPERTY Persona.cognome String
CREATE PROPERTY Persona.eta Short
Con il comando info class
possiamo visualizzare la struttura di una classe:
> INFO CLASS Persona
Class................: Persona
Default cluster......: persona (id=11)
Supported cluster ids: [11]
Cluster selection....: round-robin
PROPERTIES
+----------+-----------+-----------+----------+
NAME | TYPE
-------------------------------+---------------
eta | SHORT
nome | STRING
cognome | STRING
A questo punto, potremo provare ad effettuare qualche inserimento:
INSERT INTO Persona(nome,cognome,eta) VALUES ('carlo','neri',41)
INSERT INTO Persona(nome,cognome,eta,segni_particolari) VALUES ('carlo','neri',41,'brutto')
La prima INSERT
si attiene scrupolosamente alla definizione della classe, inserendo valori solo nelle proprietà esistenti.
La seconda, invece, inserisce un campo in più (denominato segni_particolari): grazie all'assenza di una strutturazione fissa dei dati, non ci verrà impedito di avere un record con un suo campo specifico. La seguente operazione, invece, fallirà perchè non rispetteremo la tipologia di valore di una proprietà esistente, eta, che è di tipo numerico:
INSERT INTO Persona(nome,cognome,eta,segni_particolari) VALUES ('carlo','neri','valore non numerico','brutto')
Il contenuto di una classe può essere visualizzato con il comando browse class
:
> BROWSE CLASS Persona
----+-----+-------+-----+-------+----+-----------------
# |@RID |@CLASS |nome |cognome|eta |segni_particolari
----+-----+-------+-----+-------+----+-----------------
0 |#11:7|Persona|carlo|neri |41 |null
1 |#11:8|Persona|carlo|neri |41 |brutto
----+-----+-------+-----+-------+----+-----------------
È possibile, infine, verificare sempre l'elenco delle classi disponibili in un database tramite il comando LIST CLASSES
, o semplicemente CLASSES
.
Modificare e cancellare classi
Esistono anche alcuni comandi per eliminare o modificare una classe. Con DROP CLASS
possiamo cancellarne una: se, per esempio, non avessimo più bisogno della classe Persona, potremmo utilizzare:
DROP CLASS Persona
Qualora invece volessimo modificare solo un attributo di una classe sarebbe sufficiente usare il comando ALTER CLASS
nel seguente formato:
ALTER CLASS nome-classe nome-attributo valore-attributo
Se, ad esempio, volessimo rinominare la classe Persona in Individuo, potremmo procedere così:
ALTER CLASS Persona NAME Individuo
Un altro aspetto che possiamo modificare con ALTER CLASS
è lo strict mode. Nel paragrafo precedente, la classe Persona è stata utilizzata in modalità schema-mixed, in quanto sono state definite alcune proprietà ma all'occorrenza i record hanno incluso delle proprietà personalizzate. Se volessimo usare una classe in modalità schema-full dovremmo abilitare lo strict mode nel seguente modo:
ALTER CLASS Persona STRICTMODE true
Così facendo un eventuale comando INSERT
accetterebbe solo le proprietà esplicitamente definite restituendo errore in caso
contrario.
Altri attributi che possono essere modificati verranno incontrati nel proseguo della trattazione. Una lista completa è comunque disponibile nella documentazione ufficiale.
Utilizzo dei cluster
Per poter memorizzare i record, una classe ha bisogno di avere a disposizione un cluster, la vera e propria struttura fisica. Nel paragrafo precedente abbiamo visto che con il comando info class
viene indicato, tra le altre informazioni, quali sono gli ID dei cluster in cui verranno salvati i dati della classe. A volte, potrebbe servire avere a disposizione più cluster per la medesima classe, e pertanto sarebbe necessario aggiungerne un altro. Ciò può essere fatto con il comando ALTER CLASS
:
ALTER CLASS Persona ADDCLUSTER nuovoelenco
Qualora il cluster non esistesse già, ne verrebbe creato uno fisico ed il suo ID sarebbe comunicato come output del comando. In alternativa, è possibile creare il cluster in modo esplicito:
CREATE CLUSTER nuovoelenco
Successivamente sarà quindi possibile associare il cluster così creato ad una classe.
Nel momento in cui la classe si trova ad avere più di un cluster per la memorizzazione, in fase di creazione di nuovi
record, è possibile indicare in quale di essi deve essere fatto l'inserimento:
INSERT INTO cluster:nuovoelenco(nome,cognome) VALUES ('ennio','gialli')
In questo caso abbiamo richiesto esplicitamente che il nuovo record venisse inserito nel cluster di nome nuovoelenco, che è associato alla classe Persona. Si potrebbero a questo punto visualizzare i record appartenenti alla classe come segue:
> BROWSE CLASS Persona
----+-----+-------+-----+-------+----+-----------------
# |@RID |@CLASS |nome |cognome|eta |segni_particolari
----+-----+-------+-----+-------+----+-----------------
0 |#11:7|Persona|carlo|neri |41 |null
1 |#11:8|Persona|carlo|neri |41 |brutto
2 |#13:0|Persona|ennio|gialli |null|null
----+-----+-------+-----+-------+----+-----------------
Si noti che l'ID dell'ultimo record è diverso da quello degli altri due. Il @RID
inizia con #13
mentre gli altri con #11
, a dimostrazione che i record risiedono su cluster diversi. Per visualizzare i record di un solo cluster si può usare uno dei seguenti comandi:
BROWSE CLUSTER nuovoelenco
oppure:
SELECT * FROM cluster:nuovoelenco
In entrambi i casi, l'output sarebbe il seguente:
----+-----+-------+-----+-------
# |@RID |@CLASS |nome |cognome
----+-----+-------+-----+-------
0 |#13:0|Persona|ennio|gialli
----+-----+-------+-----+-------