Bonsoir, J'aurai souhaité un retour d'expérience, conseil sur une structure SQL correspondant au besoin vulgarisé suivant :

Prenons l'exemple d'un spectacle se déroulant quotidiennement avec une trentaine de séances par jour. (La capacité globale est portée à 10000 : Seance.Se_jaugeglobale = 10000)
Lors de la réservation du spectable tant que celle-ci n'est pas confirmée par un paiement, nous devons bloquer la quantité demandée afin de ne pas provoquer un surbooking. (Panier moyen de 5 personnes ; PanierContenu.Pc_quantite = 5 ; V_SeanceRestante.Sr_jaugerestante = 9995)
Le panier peut-être abandonné par l'internaute ou libéré automatiquement au bout de x minutes d'inactivité. (Via Delete du Panier en question)
Une fois confirmé par son paiement, le panier est supprimé et transformé en vente effective ; la jauge est recalculée dans la table Séance. (Seance.Se_jaugeglobale = 10000, VenteContenu.Vc_quantite = 5, V_SeanceRestante.Sr_jaugerestante = 9995)

Actuellement, nous utilisons une vue SQL pour fournir la disponibilité restante

Structure allégée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
CREATE SCHEMA [test]
GO
 
CREATE TABLE [test].[Seance](
	[Se_id] [bigint] NOT NULL,
	[Se_dhdebut] [datetime] NOT NULL,
	[Se_dhfin] [datetime] NOT NULL,
	[Se_jaugeglobale] [int] NOT NULL,
	[Se_jaugeventes] [int] NOT NULL)
GO
 
CREATE TABLE [test].[Vente](
	[Ve_id] [bigint] NOT NULL,
	[fk_poste] [bigint] NULL,
	[fk_operateur] [bigint] NULL,
	[Ve_dhcreation] [datetime] NULL)
GO
 
CREATE TABLE [test].[VenteContenu](
	[Vc_id] [bigint] NOT NULL,
	[fk_vente] [bigint] NULL,
	[fk_seance] [bigint] NULL,
	[Vc_quantite] [int] NULL)
GO
 
CREATE TABLE [test].[Panier](
	[Pa_id] [bigint] NOT NULL,
	[fk_poste] [bigint] NULL,
	[fk_operateur] [bigint] NULL,
	[Pa_dhcreation] [datetime] NULL)
GO
 
CREATE TABLE [test].[PanierContenu](
	[Pc_id] [bigint] NOT NULL,
	[fk_panier] [bigint] NULL,
	[fk_seance] [bigint] NULL,
	[Pc_quantite] [int] NULL)
GO
 
CREATE VIEW [test].[V_SeanceRestante] AS
SELECT
	se.Se_id as fk_seance,
	se.fk_salle,
	se.Se_dhdebut as Sr_datedebut,
	se.Se_dhfin as Sr_heurefin,
	isnull(se.Se_jaugeglobale,0) as Sr_jaugeglobale,
	isnull(se.Se_jaugeglobale,0)-isnull(se.Se_jaugeventes,0)-isnull(TAB_pc.Se_jaugepaniers,0) as Sr_jaugerestante    
FROM 
	[test].[Seance] se
  	LEFT JOIN (select pc.fk_seance, SUM(Pc_quantite) as Se_jaugepaniers from [test].[PanierContenu] pc group by pc.fk_seance) AS TAB_pc ON TAB_pc.fk_seance = se.Se_id 								
GO

Nous avions choisi ce modèle afin d'éviter trop d'écritures dans la table Seance qui est déjà fortement sollicitée sur l'update de la colonne Seance.Se_jaugeventes.


Nous rencontrons cependant ponctuellement des latences (20 secondes maxi) lors de la consultation de cette vue et systématiquement proportionnelles au nombre de paniers ; la libération automatisée de paniers abandonnés toutes les x minutes (DELETE Paniers dont la durée de vie est supérieure à x minutes) provoquent également des latences. Le modèle présentée est allégée, nous gérons des sous niveaux permettant de privatiser spécifiquement une partie de la jauge globale à certains canaux de ventes en fonction de x critères, etc... Une vue est également présente pour les sous-niveaux.


Une des hypothèses envisagées serait d’éprouver le stockage de la somme des quantités correspondants aux paniers également dans la table Séance et ainsi d'éviter l'utilisation de la vue.

Pourriez-vous me fournir des pistes sur ce sujet ? Quels seraient le modèle idéal selon vos retours d'expérience (Une refonte pourrait-être envisageable)

En vous remerciant par avance.