|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Bonsoir à tous
J'ai été confronté ce matin à un petit soucis d'organisation et je n'ai pas su décider laquelle était la meilleure Je dois gérer une relation de voisinage entre deux items. J'ai donc créé la table principale Code :
Puis, ma table voisinage Code :
Mais mon problème c'est quand je veux insérer un voisin style item 1 voisin avec item 5. Là, j'ai 2 choix possibles 1) soit je rentre systématiquement dans ma table le tuple (1, 5) puis le tuple (5, 1) 2) soit je ne rentre que le tuple (1, 5) en disant "si 1 est voisin avec 5, alors 5 est automatiquement voisin avec 1". Mais dans ce cas, j'aimerais bloquer l'insertion du tuple (5, 1) si le tuple (1, 5) est déjà dans la table. Et là, j'ai pas trouvé comment faire J'ai essayé de créer une contrainte d'unicité sur le groupe (id_item2, id_item1) mais ça n'a rien empêché du tout. Et donc ma question c'est: vaut-il mieux choisir la solution 1 et avoir chaque relation de voisinage écrite 2 fois ou vaut-il mieux utiliser la solution 2 mais sans pouvoir empêcher une insertion existant déjà dans le sens inverse ? Et corollaire: y a-t-il moyen, dans Postgres, d'empêcher cette insertion si le tuple inverse est déjà présent dans la table ? Merci à tous
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Les deux solutions sont possibles.
Ma préférence va à la 1ère car elle modélise la réalité. A savoir que votre lien est bidirectionnel donc les deux sens doivent être stockés. La deuxième solution fonctionne aussi. Mais elle obligera a requêter dans les deux sens. Pour les éléments techniques d'implémentation, vous pouvez utiliser les triggers et les vues. La première solution peut utiliser un trigger after insert qui insère le 2ème tuple dans le sens inverse du premier. La deuxième solution peut utiliser un trigger before insert qui vérifie si le tupe inverse n'est pas déjà présent et une vue qui reconstruit les deux sens : Code :
|
||
|
|
10
|
|
|
#3 | ||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
C'est aussi ce que je pense. Parce que, plus tard, quand il faudra chercher les voisins de X faudra chercher "select item2 where item1=X union select item1 where item2=X". Et là, ça risque de devenir bien ch... Citation:
Toutefois, aujourd'hui j'ai trouvé une solution simple qui permet de garantir l'unicité sans se préoccuper du sens du tuple. Il suffit de créer un index unique sur ((id_item1 + id_item2), (id_item1 * id_item2)) Etant donné que l'addition et multiplication sont commutatives, le produit et la somme seront égaux quel que soit le sens du tuple. Et deux tuples différents donneront alors un couple (somme, produit) différent. C'est en pensant à l'algo de Diffie et Hellman, qui avaient aussi une problématique analogue, que j'ai eu cette idée... Ceci dit, j'aime bien l'idée du trigger qui insère automatiquement le tuple inverse. Merci beaucoup
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com