{"action":"created","issue":{"url":"https://api.github.com/repos/etalab/ban/issues/77","repository_url":"https://api.github.com/repos/etalab/ban","labels_url":"https://api.github.com/repos/etalab/ban/issues/77/labels{/name}","comments_url":"https://api.github.com/repos/etalab/ban/issues/77/comments","events_url":"https://api.github.com/repos/etalab/ban/issues/77/events","html_url":"https://github.com/etalab/ban/pull/77","id":132720663,"number":77,"title":"First version of polymorphic housenumber relations","user":{"login":"yohanboniface","id":146023,"avatar_url":"https://avatars.githubusercontent.com/u/146023?v=3","gravatar_id":"","url":"https://api.github.com/users/yohanboniface","html_url":"https://github.com/yohanboniface","followers_url":"https://api.github.com/users/yohanboniface/followers","following_url":"https://api.github.com/users/yohanboniface/following{/other_user}","gists_url":"https://api.github.com/users/yohanboniface/gists{/gist_id}","starred_url":"https://api.github.com/users/yohanboniface/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yohanboniface/subscriptions","organizations_url":"https://api.github.com/users/yohanboniface/orgs","repos_url":"https://api.github.com/users/yohanboniface/repos","events_url":"https://api.github.com/users/yohanboniface/events{/privacy}","received_events_url":"https://api.github.com/users/yohanboniface/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":5,"created_at":"2016-02-10T14:57:19Z","updated_at":"2016-02-12T11:03:59Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/etalab/ban/pulls/77","html_url":"https://github.com/etalab/ban/pull/77","diff_url":"https://github.com/etalab/ban/pull/77.diff","patch_url":"https://github.com/etalab/ban/pull/77.patch"},"body":"Voici une première implémentation du modèle discuté lors de notre point lundi.\r\n\r\n### Quelques détails:\r\n- Street, Locality, District et Postcode peut être indistinctement associés à Housenumber, via un modèle Proxy (chacun a une FK qui pointe sur Proxy)\r\n- Street, Locality, Disctric et Postcode n'ont pas d'autoincrement et \"héritent\" de l'id du proxy \r\n- Housenumbers a deux relations sur Proxy: un `parent` qui est une FK simple et un `ancestors`, une M2M *(voir point plus bas pour une discussion spécifique)*\r\n- en l'état PostCode a une relation unique (et obligatoire) vers Municipality, ce qui veut dire que, en l'état, quand un postcode s'étant sur plusieurs communes il y aura plusieurs rows (une par commune): si j'ai bien compris, c'est au final ce qu'on veut puise que le libellé d'acheminement sera différent\r\n- globalement le côté \"transparent\" du proxy fonctionne, mais je suis pas ultra satisfait de l'implémentation actuelle, faudra que j'y repasse un peu si on continue sur cette voie\r\n- question philosophique: je me demande si on vraiment besoin d'une relation si ouverte: au final, par exemple, on sait qu'on voudra jamais deux objets Street associés au même housenumber, or en l'état on ne pourra proprement se prémunir contre un tel cas\r\n- avoir Proxy empêche d'utiliser des identifiant secondaires en relations (par exemple passer \"fantoir:12345\" pour ajouter une rue à un housenumber)\r\n- le CEA est laissé sur Housenumber, partant du principe qu'on accepterait de dupliquer les fameux 53 cas sur 26 millions\r\n- je pense qu'on peut fusionner Locality et District, en autorisant le NULL pour fantoir (ce qu'on devra faire quoi qu'il en soit), ou éventuellement en redescendant la clé dans le hstore `attributes`.\r\n\r\n### Sur le choix entre M2M et FK+M2M:\r\nConcernant la relation Housenumber et parents, on a deux options:\r\n- ou bien simplement une m2m ordonnée, et c'est la première de ces m2m qui est le parent principal (et qui doit d'une manière ou d'une autre être obligatoire)\r\n- ou bien une FK qui définit le parent (obligatoire) et une m2m pour toutes les relations optionnelles\r\n\r\nLe premier cas pose deux problèmes ennuyeux:\r\n- il est difficile de s'assurer de façon certaine qu'un housenumber ait toujours au moins une relation (bien sûr le python peut faire tout son possible, mais il n'est pas possible d'avoir de contrainte en base de données, sauf à avoir des triggers); c'est d'autant plus délicat à contrôler au moment de la suppression d'un objet Street ou autre (cet objet est-il associé à un housenumber dont il serait le seul parent?).\r\n- il est impossible d'éviter les doublons: aucune contrainte en base ne nous permet d'empêcher que deux housenumber \"2 bis\" soient associés à la \"rue des Vignes\".\r\n\r\nLe deuxième cas aussi:\r\n- pas possible d'empêcher des doublons entre les deux relations, par exemple d'avoir une street en tant que `parent` ET dans `ancestors`\r\n- ça fait deux relations à requêter pour remonter la relation, par exemple trouver tous les housenumbers d'un objet Street\r\n\r\nDans les deux cas il est difficile d'empêcher d'avoir deux objets Street liés à un même housenumber tout en autorisant plusieurs District ou plusieurs Postcode.\r\n\r\ncc @christopheprudent @cquest and all pour discussion."},"comment":{"url":"https://api.github.com/repos/etalab/ban/issues/comments/183276045","html_url":"https://github.com/etalab/ban/pull/77#issuecomment-183276045","issue_url":"https://api.github.com/repos/etalab/ban/issues/77","id":183276045,"user":{"login":"yohanboniface","id":146023,"avatar_url":"https://avatars.githubusercontent.com/u/146023?v=3","gravatar_id":"","url":"https://api.github.com/users/yohanboniface","html_url":"https://github.com/yohanboniface","followers_url":"https://api.github.com/users/yohanboniface/followers","following_url":"https://api.github.com/users/yohanboniface/following{/other_user}","gists_url":"https://api.github.com/users/yohanboniface/gists{/gist_id}","starred_url":"https://api.github.com/users/yohanboniface/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yohanboniface/subscriptions","organizations_url":"https://api.github.com/users/yohanboniface/orgs","repos_url":"https://api.github.com/users/yohanboniface/repos","events_url":"https://api.github.com/users/yohanboniface/events{/privacy}","received_events_url":"https://api.github.com/users/yohanboniface/received_events","type":"User","site_admin":false},"created_at":"2016-02-12T11:03:59Z","updated_at":"2016-02-12T11:03:59Z","body":"@christopheprudent humm, autre souci avec le modèle m2m seul: il est impossible d'éviter les doublons: aucune contrainte en base ne nous permet d'empêcher que deux housenumber \"2 bis\" soient associés à la \"rue des Vignes\" par exemple, puisque la m2m est exprimée dans une table séparée.\r\n"}}