Bonjour à tous,
Je vous décris mon cas :

Je dois stocker des événements que je réceptionne via un webservice. Vous pouvez trouver 4 exemples en annexe à la fin de ce message.

Je dois ensuite les stocker et les mettre à disponibilité d'un autre webservice qui les requête en les filtrant selon des paramètres donnés.
Voici le genre de filtres applicables :
- Filtrer sur les dates (date exacte ou date range)
- Filtrer sur le readPoint->id : Une liste est fournie dans la requête et il faut vérifier si l'une d'elle matche
- Il existe une hiérarchie de readPoint. Un autre filtre consiste à vérifier si le readPoint->id possède un enfant qui matche une liste fourni dans la requête. (la hiérarchie des readpoints serait stockée dans une base relationnelle en parallèle de la base NoSQL, c'est envisageable ?)
- Filtre selon un wilcard sur le champs epcList>epc (exemple: vérifier si un epc matche la chaine urn:epc:id:sgtin:4000001.001602.*)

A savoir que niveau écriture, environ 30 événements seront insérés par seconde. La base ne sera jamais purgée et le but est de traiter des événements sur plusieurs dizaines d'années à terme.

J'étais parti dans un premier temps sur une base relationnelle classique Oracle mais je pense finalement qu'une base NoSQL serait adaptée car :
- Les requêtes doivent s'exécuter dans un délai raisonnable et ce genre de base apporterait à priori des performances
- les structures des événements ne sont pas figées et sont amenées à évoluer
- Le modèle de donnée serait beaucoup moins complexe

Je me suis renseigné sur les types de bases NoSQL et je pense que celui qui convient le mieux dans mon cas est le type de base orienté document. Les événements seraient alors stockés sous la forme de JSON.
Travaillant dans un environnement .Net, j'ai pensé à la base RavenDB. De plus, elle profite du moteur de recherche Lucene qui pourrait me profiter pour mes requêtes de filtrage.

Qu'en pensez-vous ??

Merci d'avance pour votre avis.

Annexe :


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
<ObjectEvent>
	<eventTime>2007-11-08T10:00:00Z</eventTime>
	<eventTimeZoneOffset>+02:00</eventTimeZoneOffset>
	<epcList>
		<epc>urn:epc:id:sgtin:4000001.001602.100</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.101</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.102</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.103</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.104</epc>
	</epcList>
	<action>ADD</action>
	<bizStep>urn:epcglobal:epcis:bizstep:core:other</bizStep>
	<disposition>urn:epcglobal:epcis:disp:core:unknown</disposition>
	<readPoint>
		<id>urn:epc:id:sgln:4000001.00005.0</id>
	</readPoint>
	<bizLocation>
		<id>urn:epc:id:sgln:4000001.00002.0</id>
	</bizLocation>
</ObjectEvent>

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
<AggregationEvent>
	<eventTime>2007-11-08T12:00:00Z</eventTime>
	<eventTimeZoneOffset>+02:00</eventTimeZoneOffset>
	<parentID>urn:epc:id:sgtin:4000001.099999.100</parentID>
	<childEPCs>
		<epc>urn:epc:id:sgtin:4000001.001602.100</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.101</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.102</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.103</epc>
		<epc>urn:epc:id:sgtin:4000001.001602.104</epc>
	</childEPCs>
	<action>ADD</action>
	<bizStep>urn:epcglobal:epcis:bizstep:core:other</bizStep>
	<disposition>urn:epcglobal:epcis:disp:core:processing</disposition>
	<readPoint>
		<id>urn:epc:id:sgln:4000001.00006.0</id>
	</readPoint>
	<bizLocation>
		<id>urn:epc:id:sgln:4000001.00002.0</id>
	</bizLocation>
</AggregationEvent>


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<QuantityEvent>
	<eventTime>2007-10-31T09:26:00Z</eventTime>
	<eventTimeZoneOffset>+02:00</eventTimeZoneOffset>
	<epcClass>urn:epc:idpat:sgtin:4000001.000457.*</epcClass>
	<quantity>1</quantity>
	<bizStep>urn:epcglobal:fmcg:bizstep:receiving</bizStep>
	<disposition>urn:epcglobal:hls:disp:active</disposition>
	<bizLocation>
		<id>urn:epc:id:sgln:4000001.00002.0</id>
	</bizLocation>
</QuantityEvent>
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
<TransactionEvent>
	<eventTime>2007-11-08T16:00:00Z</eventTime>
	<eventTimeZoneOffset>+02:00</eventTimeZoneOffset>
	<bizTransactionList>
		<bizTransaction type="urn:epcglobal:fmcg:btt:po">http://transaction.gs1-germany.de/po/40123</bizTransaction>
	</bizTransactionList>
	<epcList>
		<epc>urn:epc:id:sscc:4000001.3123456789</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.100</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.101</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.102</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.103</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.104</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.105</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.106</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.107</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.108</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.109</epc>
		<epc>urn:epc:id:sscc:4000001.3123456799</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.110</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.111</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.112</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.113</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.114</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.115</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.116</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.117</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.118</epc>
		<epc>urn:epc:id:sgtin:4000001.099999.119</epc>
	</epcList>
	<action>ADD</action>
	<bizStep>urn:epcglobal:epcis:bizstep:core:shipping</bizStep>
	<disposition>urn:epcglobal:epcis:disp:core:unknown</disposition>
	<readPoint>
		<id>urn:epc:id:sgln:4000001.00016.0</id>
	</readPoint>
</TransactionEvent>