1 of 52

SEPTEMBER 21 -22, 2023 - LILLE, FRANCE & ONLINE

COMMENT UTILISER UNE MATERIALIZED VIEW POSTGRESQL AVEC API PLATFORM ?

2 of 52

Materialized view, késako ?

Introduction

Implémentation

What’s next ?

Exemple/Démo

01

02

03

04

05

3 of 52

01 - Introduction

4 of 52

À propos de moi

Damien LEVALLOIS

  • Éclectique qui a travaillé dans de nombreux domaines.
  • Dans le monde du dev depuis 5 ans.
  • Travaillé exclusivement dans le milieu de l’automobile.
  • Premier talk en conférence

5 of 52

Questions à l’assemblée

Qui connait les materialized views ?

Qui a des requêtes complexes qui posent des problèmes de performance ?

6 of 52

02 – Materialized view, késako ?

7 of 52

Description

Résultat d’une requête complexe mis en cache.

Données stockées physiquement.

On peut y rajouter des clés primaires ainsi que des index.

8 of 52

Syntaxe de création/suppression

CREATE MATERIALIZED VIEW [IF NOT EXISTS] table_name

[ (colonne1, colonne2, …)]

AS query

[WITH [NO] DATA]

DROP MATERIALIZED VIEW [IF EXISTS] table_name

9 of 52

Rafraichissement

REFRESH MATERIALIZED VIEW [CONCURRENTLY] table_name

[WITH [NO] DATA]

CONCURRENTLY a besoin de l’existence d’un index unique sur la view.

10 of 52

Mapping sur une ressource

11 of 52

Mapping sur une ressource

12 of 52

Mapping sur une ressource

13 of 52

Avantages

  • Rapidité d’accès aux données.
  • Possibilité de query comme une table traditionnelle (where, count, etc…)
  • Possibilité de mapper la view sur une resource API.

14 of 52

Inconvénients

  • Rafraichissement des données pas automatique.
  • Pas de possibilité de modifier la query.
  • Non supporté par Doctrine.
  • Pas de foreign key

15 of 52

La genèse du projet

16 of 52

Contexte

Application de gestion de stock de véhicules

80% des pages sont des tableaux

Recherche « floue » faite via elastic search

Demande de réduire la stack technique

17 of 52

Manipulation données

ERP

Export données CSV

Import application

Indexation elastic

18 of 52

Schéma données

Véhicule

Site

- libelle

Marque

- libelle

Pole

- libelle

Modèle

- libelle_origine

- libelle

- puissance

Famille

- libelle_origine

- libelle

SuiviVente

Finition

- libelle

Moteur

- énergie

- type_boite

Silhouette

- libelle

Teinte

- libelle_origine

- libelle

Options

- code

- libelle

Evenement

Type: livraison

Where

SuiviVente.state <> ‘vendu_livre’ or

e.Date > 1 month ago

19 of 52

Avant

Recherche utilisateur

Recherche Elastic

Récupération d’un tableau d’ids

Query builder -> where id IN :ids

20 of 52

Après

Création materialized view

Concaténation des éléments de recherche dans un seul champ

Id, recherche

21 of 52

Après

ERP

Export données CSV

Import application

Mise à jour de la materialized view

22 of 52

Après

Recherche utilisateur

Sub query dans la view

Query builder -> where id IN sub_query

23 of 52

03 – Implémentation

24 of 52

Création/suppression

25 of 52

Attribut

26 of 52

Commande création/suppression

27 of 52

Commande création/suppression

28 of 52

Commande création/suppression

29 of 52

Mise à jour

30 of 52

Asynchrone

31 of 52

Asynchrone

32 of 52

Asynchrone

33 of 52

Pool handler

34 of 52

Pool handler

35 of 52

Pool handler

36 of 52

Et API platform dans tout ça ?

37 of 52

Extra properties

38 of 52

Extra properties

39 of 52

Request listener

40 of 52

Response listener

41 of 52

Résumé

Request listener

ViewPoolHandler

Extra properties

Processor?

Listener workflow?

Autre traitement métier

->add()

Response listener

->handleRefresh()

Refresh view event

Messenger (asynchrone)

->dispatch()

DB

refresh view

42 of 52

04 – What’s next ?

43 of 52

What’s next ?

  • Permettre l’utilisation de Mercure pour notifier des changements de données sur les materialized view.
  • Gérer l’unicité des demandes de refresh
  • En faire un plug-in API Platform.

44 of 52

What’s next ?

Request listener

ViewPoolHandler

Extra properties

Processor?

Listener workflow?

Autre traitement métier

->add()

Response listener

->handleRefresh()

Refresh view event

Messenger (asynchrone)

->dispatch()

DB

refresh view

Unicité message

New/update/delete

45 of 52

05 – Exemple/Démo

46 of 52

Schéma données

Véhicule

Marque

Options

Concession

Région

5 options les plus vendues par marque et par région ?

47 of 52

Requête

48 of 52

Performances

10000 véhicules

160 ms

Vs

30 ms

50000 véhicules

200 ms

Vs

30 ms

150000 véhicules

700 ms

Vs

30 ms

49 of 52

Code démo

50 of 52

Code démo

51 of 52

Code démo

52 of 52

Code démo