PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 19/09/2014 15:14:06

bouchigreque
Membre

PlProxy et répartition des données

Bonjour à tous,

j'aurais besoin d'une petite aide sur un problème avec PlProxy, parce que là je vous avoue que je sèche.

En gros, j'ai actuellement 4 shards (avec id_topic comme clé) répartis sur 4 serveurs, jusque là tout va bien. Toutes mes procédures stockées ont bien été 'proxifiées' et tout fonctionne comme sur des roulettes.
Le problème se pose avec une seule procédure, celle qui permet de déplacer un message d'un topic vers un autre topic qui se présente comme ça :

CREATE OR REPLACE FUNCTION deplace_message(
    in_id_message BIGINT,
    in_id_topic_origin BIGINT,
    in_id_topic_move BIGINT,
) RETURNS void AS $$
BEGIN
    UPDATE message
        SET id_topic_message = in_id_topic_move
        WHERE id_topic_message = in_id_topic_origin
        AND id_message = in_id_message;
END;
$$ LANGUAGE plpgsql STABLE SECURITY DEFINER;

(La procédure n'est pas complète, je fais ensuite pas mal de traitements / vérifications par la suite, mais c'est cette partie qui pose problème)
En gros cette fonction prend en paramètre l'id du message, l'id de l'ancien topic, et l'id du nouveau topic et change juste l'id de l'ancien topic par celui du noveau dans la table message.
J'ai une clé étrangère qui référence donc id_topic dans la table message.

Le soucis c'est que vu que je shard par id_topic, l'id_topic_origin et l'id_topic_move ne sont pas forcément sur la même shard. Et c'est au moment de déclarer ma procédure proxifiée que se pose le soucis :

CREATE OR REPLACE FUNCTION move_message(
    in_id_message BIGINT,
    in_id_forum INTEGER,
    in_id_topic_origin BIGINT,
    in_id_topic_move BIGINT,
    in_id_alias INTEGER,
    in_groupe_alias INTEGER
) RETURNS SETOF void AS $$
    CLUSTER 'main'; RUN ON ??
$$ LANGUAGE plproxy;

Au niveau du RUN ON, d'habitude, je fais juste un RUN ON mod(id_topic, 4); ce qui fonctionne correctement, mais dans ce cas là, comment puis-je faire pour ne pas violer la contrainte de clé étrangère ?

D'avance merci !

Dernière modification par bouchigreque (19/09/2014 15:14:41)

Hors ligne

Pied de page des forums