Cassandra : Modélisation et création de base de données

Gérer des ventes

On souhaite formaliser le modèle d'un site de partage de vidéo nommé CassTube, les utilisateurs possèdent un login unique, ainsi que leur nom et leur prenom. Les vidéos possèdent un id, un nom et une description. Un utilisateur possède plusieurs vidéos, et les vidéos possèdent des commentaires de plusieurs utilisateurs.

Nous souhaitons rechercher une liste des vidéos, ainsi que les vidéos par utilisateur. Enfin, nous chercherons aussi à récupérer les commentaires d'une vidéo ou les commentaires d'un utilisateurs

Question

Proposer une modélisation normalisée.

Question

Proposer maintenant la modélisation pour Cassandra.

Indice

Il y a une relation one to many et une relation many to many.

Indice

On ne souhaite pas faire des requêtes sur les utilisateurs.

Lancer la console CQL.

Sous Windows, pour pouvoir faire des copier coller, lancer la console via l'invite de commande.

Question

Créer un keyspace ai07

Solution
1
CREATE KEYSPACE ai07 WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

Question

Créer les column family nécessaire.

Pour faciliter les exercices suivant, nous allons aussi créer une table user qui ne contiendra que le login, nom et prénom des utilisateurs créés.

Indice

Ne pas oublier de se placer dans le keyspace ai07

Indice

USE AI07;

Indice

CREATE TABLE <table> {

champs1 type,

champs2 type,

....

PRIMARY KEY(champs1)

} ;

Solution

videos

1
CREATE TABLE videos (
2
  video_id uuid,
3
  video_name varchar,
4
  video_uploaded timestamp,
5
  user_login varchar,
6
  PRIMARY KEY(video_id));

videos_by_user

1
CREATE TABLE user_videos_index (
2
  login varchar,
3
  video_id uuid,
4
  video_name varchar,
5
  PRIMARY KEY(login, video_id));

comments_by_videos

1
CREATE TABLE comments_by_video (
2
  video_id uuid,
3
  user_login varchar,
4
  comment_dat timestamp,
5
  comment varchar,
6
  PRIMARY KEY(video_id, user_login));

comments_by_user

1
CREATE TABLE comments_by_user (
2
  user_login varchar,
3
  video_id uuid,
4
  comment_dat timestamp,
5
  comment varchar,
6
  PRIMARY KEY(user_login, video_id));

user

1
CREATE TABLE users (
2
login varchar,
3
firstname varchar,
4
lastname varchar,
5
PRIMARY KEY(login));

Question

insérer les videos suivantes et vérifier que l'insertion est correcte.

id (example) - video_name - video_uploaded - login

1 - KeyboardCat - now - cschmidt (Chris Schmidt)

2 - NyanCat - now - saraj00n (Sarah June)

Ajouter ensuite l'utilisateur suivant (sans vidéo) : MasterTroll (Jean Fabrice)

Vérifier l'insertion dans la table vidéo, puis recherchez les vidéos de l'utilisateur 'saraj00n'.

Indice

INSERT INTO <table>(<colonnes....>) VALUES (<Valeurs...>);

Indice

N'oubliez pas d'insérer les vidéos dans la table d'index !

Indice

Pour générer un UUID, utilisez uuid()

Pour récupérer la date actuelle, utilisez dateof(now))

Solution
1
INSERT INTO users(login, firstname, lastname) VALUES ('cschmidt', 'chris', 'SCHMIDT');
2
INSERT INTO users(login, firstname, lastname) VALUES ('saraj00n', 'Sarah', 'JUNE');
3
INSERT INTO users(login, firstname, lastname) VALUES ('MasterTroll', 'Jean', 'FABRICE');
4
INSERT INTO videos (video_id, video_name, video_uploaded, user_login) VALUES (uuid(),'Keyboard Cat', dateof(now()), 'cshmidt');
5
INSERT INTO user_videos_index (login, video_id, video_name) VALUES ('cschmidt', the generated uuid, 'Keyboard Cat');
6
INSERT INTO videos (video_id, video_name, video_uploaded, user_login) VALUES (uuid(),'nyan cat', dateof(now()), 'saraj00n');
7
INSERT INTO user_videos_index (login, video_id, video_name) VALUES ('saraj00n', the generated uuid, 'nyan cat');
8
SELECT * FROM videos;
9
SELECT video_name FROM user_videos_index WHERE login='saraj00n';
10

Question

Insérer le commentaires suivants :

1 - le 15/01/2017 à 12h00, saraj00n a écrit 'first' sur la vidéo 'Keyboard Cat'

2 - le 15/01/2017 à 12h05, MasterTroll a écrit 'thats lame' sur la vidéo 'Keyboard Cat'

Indice

Utilisez le format de date epoch.

Solution
1
INSERT INTO comments_by_user (user_login, video_id, comment_dat, comment) VALUES (saraj00n, generated uuid, '1484481600', 'first');
2
INSERT INTO comments_by_videos (video_id, user_login, comment_dat, comment) VALUES (generated uuid, saraj00n, '1484481600', 'first');
3
INSERT INTO comments_by_user (user_login, video_id, comment_dat, comment) VALUES (MasterTroll, generated uuid, '1484481900', 'thats lame');
4
INSERT INTO comments_by_videos (video_id, user_login, comment_dat, comment) VALUES (generated uuid, 'MasterTroll', 1484481900, 'thats lame');
5
SELECT * FROM comments_by_user;
6
SELECT * FROM comments_by_video;

Question

Insérer cet utilisateur :

INSERT INTO users (client_id , nom, prenom , age) VALUES ('saraj00n', 'Sarah', 'Junior');

Que se passe-t-il ?

Solution

L'utilisateur saraj00n existait déjà (Sarah Junior). L'insert ne renvoie pas d'erreur mais fait un update de la ligne.

Question

L'utilisateur MasterTroll décide de dévoiler son identité au grand jour, il change son nom pour PAUL

Indice

Il faut faire un update

Indice

UPDATE livre SET titre = 'Le rouge et le noir' WHERE <key> = <value>;

Solution
1
UPDATE users SET lastname='PAUL' WHERE login='MasterTroll';
2
SELECT * FROM users;

Question

L'utilisateur Jean PAUL se fait banir, supprimer l'utilisateur

Indice

On doit utiliser la clé primaire

Indice

DELETE FROM Persons WHERE <key> = <value>;

Indice

C'est l'utilisateur MasterTroll

Solution
1
DELETE FROM users WHERE login = 'MasterTroll';

Question

Supprimez la column family users.

Solution
1
drop table users;

Question

Supprimer le keyspace.

Solution
1
DROP KEYSPACE ai07;
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Mathieu Moulin, Emilie Confais, Alaeddine Hajjem, David Martins, 2014-2015 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)