Bref c'est exactement ce que je proposais plus haut qui résoud tous
les problèmes, sauf que le slide suggère l'addition de champs
start_date/end_date pour chaque attribut, ce que je trouve plutôt
redondant, on peut très bien se débrouiller avec des objets distincts,
avec juste cette parire d'attributs pour une objet. Leur idée de dater
les attributs est que pour eux il s'agit du même objet (mais l'ennui
ce sont les références depuis un autre objet : il faudrait alors dater
chaque noeud inclus dans un chemin, et chaque membre d'une relation.

Il me semble plus propre de ne mettre qu'une paire par objet, pas pour
chacun de ses membres, et de considérer que ce sont des objets
différents, comme si c'était des couches d'une autre dimension :

- imaginons qu'une communauté de communes référence deux communes mais
que ces communes fusionnent
- on crée une nouvelle relation pour la nouvelle commune (même si elle
conserve le même nom et même numéro INSEE, mais probablement pas le
même numéro ref:SIREN=21depCOMx qui a des incidences comptables car
les comptes de chaque entité coexistent pendant un certain temps le
temps que les transferts de responsabilité et engagements financiers
ou contractuels se terminent).
- on crée une nouvelle relation pour la nouvelle communauté de
communes puisque ses membres ont changé et sa géométrie a pu changer
- les anciennes relations de la commune et de la communauté de
communes persistent mais on leur met une date de fin de
validité.L'ancienne communauté de commune continue de référencer
l'ancienne relation : la contrainte est que les membres de la relation
de communauté de communes doivent avoir des dates de validité
totalement incluses dans la période de validité de la communauté de
communes.

Le problème est : que faire quand il y a des incertitudes de dates, en
terme de validité référencielle ? Il faut une règle permettant une
tolérance.
Par exemple quand on a "start_date=c1890" (circa 1890) dans une objet
référent, il s'agit d'une tolérance de l'ordre de la décennie, comme
si la date de début validité du référent commençait en 1895, 5 ans
plus tart (sans aller au delà de la date indiquée en end_date) ; dans
l'objet référé la date de début de validité "c1890" est étendue 5 ans
plus tôt à partir de 1885, de sorte que la validité de l'objet
référent est entièrement incluse dans l'objet référencé. Toutefois un
validateur en mode strict fera un test de date sans tolérance et
affichera un "warning" pour vérifier si les dates sont compatibles.

Même chose si une date mentionne une décennies sous la forme "start_date=1890s".

Si la date de début mentionne juste une année, on peut réduit la
tolérance à moins d'un an; si la date mentionne le mois, on réduit la
tolérance à moins d'un mois. Si la date mentionne le jour la tolérance
est de moins de quelques heures ; je ne suis pas sûr qu'il faille
prendre en compte les heures dans les champs date, mais le format
ISO8601 standard (yyyy-mm-ddThh:mi:ssZ) le permet.

Si l'incertitude de la date de début (ou de fin) est différente, on
pourrait encore avoir start_date=1890-02-28+7d pour préciser un
intervalle d'incertitude de plus ou moins 7 jours autour de cette date
(donc ici dans 14 jours ou 15 dates). start_date=1890+2y indiquerait
une tolérance de plus ou moins 2 ans avant ou après 1890.

L'autre solution étant de traduire directement cet intervalle de dates
en deux attributs donnant des dates précises si cela facilite les
requêtes SQL : start_date=1890-02-21..1892-03-07 et
start_date=1888..1892 pour les deux cas précédents.

Les incertitudes de dates peuvent exister pour la date de début comme
pour la date de fin de validité (les 4 dates sont alors en ordre
croissant ; la paire à utiliser pour les tests de référence sont de
prendre le plus plus grand intervalle des dates 1 et 4 pour l'objet
référencé, et le plus petit intervalle des dates 2 et 3 pour l'objet
référent).

Certes cela duplique les objets et les attributs, mais il est plus
simple de gérer l'intégrité référentielle au niveau de chaque objet
ayant un ID unique qu'avec un seul objet avec des attributs dont les
valeurs sont datés et deviennent des listes de valeurs. Mais des
solutions peuvent être développées pour les éditeurs qui veulent
vouloir pouvoir saisir un même objet avec des attributs (et membres de
relation) datés individuellement. Il est même possible de lier ces
objets à un objet maître liant les ID d'objets entre eux dans une
liste odonnée par date avec une relation spéciale de type "history"
comme une relation normale, sauf que les relations elles-mêmes ou
autres objets ne sont pas modifiés, il n'y a que la nouvelle relations
spéciale qui au lieu de contenir des listes d'objets quelconque
contient une liste d'ID d'objets avec chacun leurs intervalles de date
de validité au lieu du rôle (cette relation spéciale appliquant des
contraintes : les intervalles ne doivent avoir aucune intersection
hors des intervalles de tolérance).

Bref aucune modification du schéma des objets actuels : noeuds,
chemins et relations, mais l'ajout d'une primitive "history"
permettant de lier un objet à ses dates de validité et ses versions
successives dans des ID différents. L'intégrité référencielle reste
conservée par les IDs comme actuellement, et il devient possible alors
de ne pas tout charger et travailler sur une date précise (par défaut
aujourd'hui, ou de demander à charger les autres dates et d'avoir
dfférentes vues successives d'un objet qui a changé d'état.

Maintenant si on commence à historiser les attributs ou membres d'une
relation ou nœuds membres d'un chemin, on va se retrouver à modifier
toutes les 3 primitives et là ça risque d'être compliqué et risqué à
gérer car on aura des listes de valeurs pour chaque attribut ou
membre/rôle d'une relation, ainsi que chaque nœud d'un chemin (c'est
surtout là que le modèle va exploser, d'autant plus que ces noeuds
forment déjà une liste ordonnée et connectée qui ajoute d'autres
contraintes pour la validité géométrique).

La solution avec des tags supplémentaires ajoutés aux objets me semble
aussi plus fragile qu'une solution utilisant une primitive
relationelle nouvelle liant les objets datés entre eux (et n'offira
pas une bonne compatibilité avec les éditeurs et entrainera des
confusions dans les données, sauf si le moteur assure que ces tags de
date sont bien réservés à cet usage, et sont stockés en interne dans
des primitives cachées, grace à une convention de nommage réservées au
tags internes spéciaux de même nature que le tag du type d'objet
node/way/relation ou du tag de l'id, renforcée par un test de
cohérence côté serveur et une indexation spéciale à part).

2013/1/4 Pieren <pier...@gmail.com>:
> Tout ce que vous suggérez (et plus encore) est présenté dans ce
> slideshare montré au SOTM de ... 2009:
> http://www.slideshare.net/frankieroberto/mapp-history-on-open-street-map

_______________________________________________
Talk-fr mailing list
Talk-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-fr

Répondre à