私のアプリケーションでTrelloのようなkanbanアジャイルボードを実装しようとしています。私はそれを最善の方法でやる方法が不思議です。私はこれらのエンティティを検討している:KanBanデータベースアーキテクチャ
会は
多くのリスト
を持って
リストは、私が「しかしカード
は、いくつかのコンテンツ
が含まれている多くのカード
を持っていますカードの注文につかまった。各カードは、リスト内で特定の順序でカードを並べ替えるソート位置を持つ必要があります。カードをドラッグするときに、カードの位置を変更してデータベースに保存する必要があります。これを行う最も効率的な方法は何ですか?
カードを別の位置(何百ものカードがあります)にドラッグした後、List(または2)のすべてのカードの位置を再計算する必要があるため、各カードにposition
フィールドを追加するのは冗長です。私はリストにすべてのカードIDの配列を格納し、この配列でカードをソートすることを考えていました。このソリューションの賛否両論は何ですか?そしてもっと良い解決策はありますか?
私はRuby on RailsとPostgreSQLを使用しています。私は、次の解決策を考え出した@cske答え使用
UPDATE
:
CREATE OR REPLACE FUNCTION move_buyer_card(
new_list_id INT
, param_id INT
, new_position INT
) RETURNS FLOAT4
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
var_lower_bound FLOAT4;
var_upper_bound FLOAT4;
var_new_weight FLOAT4; /*between 0 and 1*/
BEGIN
IF new_position < 2 THEN /*first position*/
var_lower_bound := 0;
SELECT MIN(weight) FROM Buyers
WHERE board_list_id = new_list_id
INTO var_upper_bound;
IF var_upper_bound IS NULL THEN /*empty list*/
var_upper_bound := 1;
END IF;
ELSE /*not first position*/
WITH ordered_cards AS (
SELECT id, RANK() OVER (ORDER BY weight ASC) AS rank, weight
FROM Buyers WHERE board_list_id = new_list_id
)
SELECT cards0.weight, cards1.weight from ordered_cards cards0
JOIN ordered_cards cards1
ON cards0.rank = cards1.rank - 1
WHERE cards1.rank = new_position
INTO var_lower_bound, var_upper_bound;
IF NOT FOUND THEN /*only 1 item in list OR last position*/
SELECT MAX(weight) FROM Buyers WHERE board_list_id = new_list_id
INTO var_lower_bound;
IF var_lower_bound IS NULL THEN /*empty list*/
var_lower_bound := 0;
END IF;
var_upper_bound := 1;
END IF;
END IF;
var_new_weight := var_lower_bound + (var_upper_bound - var_lower_bound)/2;
UPDATE Buyers
SET weight = var_new_weight,
board_list_id = new_list_id
WHERE id = param_id;
RETURN var_new_weight;
END;
$$;
感謝。それは実用的な解決策です。少し修正されたコードで私の質問を更新しました - あなたはそれについてコメントできますか?私のソリューションは少しシンプルです(混乱しない数字)。 – leemour
@leemourこれは単純です(あなたのコードではparam_idが既にバイヤーにありますが(最後に更新)チェックはしません)、適切なテストケースを忘れないでください(空リスト、単一要素リスト内での移動、 ...)、テーブル構造が質問に表示されない詳細を伝えるのが難しい – cske
はい、私はすべてのエッジケースに対してバージョンを完全にテストしました。あなたのソリューションは最後のアイテムのウェイトを1に設定し、その後アイテムを追加するとウェイトを1より大きい値に設定します。それを考慮に入れてソリューションを更新してもよろしいですか?私は 'vub:= 2;を' vub:= 1; '、' ON c1.r = c0.r + 1'に 'ON c0.r = c1.r - 1'と' vub:=(vlb +1)* 2; 'vub:= 1' – leemour