Asopitech With · プロジェクト管理
Trello ボード with Alopex DB & Alopex Chirps
Trelloは、ボードの上でカードをリストからリストへ動かし、チームの仕事の流れを見えるようにするプロジェクト管理のツールです。これをAlopex DBとAlopex Chirpsで作り直すと…?
更新: 2026/10/13
どんなサービスか
Trelloの基本の部品は、ボード、リスト、カードです。リストで仕事の流れを作り、カードを各段階に動かします。カードは、ボードの中でいちばん小さく、いちばん詳しい単位です。今回作り直すのは、ボードとカードの部分です。
データの置き場所
- Alopex DBのSQLテーブル:ボード、リスト、カード、メンバー、カードのコメントをSQLテーブルに持ちます。カードの並びは、リストと順番の列で表します。
- Alopex Chirpsのメッセージ:カードを動かした、書き換えたという変更を、サーバーのノードの間にChirpsで届けます。
- 合意:同じカードへの変更の順番は、ChirpsのRaftの合意でそろえます。
変更を画面に反映するのは、アプリのコードです。
配置の形
Alopex DBとChirpsを、サーバーのノードに組み込みます。ボードのデータはAlopex DBのクラスタに置き、ノードの一覧と生死はChirpsのgossipのメンバーシップで分かります。
Alopex DBとAlopex Chirpsが合う理由
ボードのデータは、リストとカードの関係と、その順番です。Alopex DBはその関係をSQLで持ち、Chirpsは変更をノードの間に直接届けます。メッセージのための別のサーバーは要りません。
コードで見る
ボード・リスト・カードはAlopex DBが持ちます(変更の配送はChirps)。カードを動かして並べ替える中心だけを取り出したコードです。
import alopex
# ボード・リスト・カードは Alopex DB(変更の配送は Chirps)
db = alopex.Database.open("trello.alopex")
db.execute_sql("CREATE TABLE IF NOT EXISTS lists (id INTEGER PRIMARY KEY, name TEXT)")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS cards (
id INTEGER PRIMARY KEY,
list_id INTEGER,
pos INTEGER,
title TEXT
)
""")
for lid, name in [(1, "ToDo"), (2, "Doing")]:
db.execute_sql("INSERT INTO lists (id, name) VALUES (?, ?)", [lid, name])
for cid, list_id, pos, title in [(1, 1, 0, "仕様を書く"), (2, 1, 1, "レビュー依頼"), (3, 2, 0, "実装")]:
db.execute_sql("INSERT INTO cards (id, list_id, pos, title) VALUES (?, ?, ?, ?)", [cid, list_id, pos, title])
# カードを別のリストへ動かす(list_id と pos を書き換える)
db.execute_sql("UPDATE cards SET list_id = ?, pos = ? WHERE id = ?", [2, 1, 2])
# 「Doing」リストのカードを順番に並べる
for row in db.execute_sql("""
SELECT c.pos, c.title
FROM cards AS c
JOIN lists AS l ON l.id = c.list_id
WHERE l.name = ?
ORDER BY c.pos
""", ["Doing"]):
print(row["pos"], row["title"])カードの移動は list_id と pos の書き換えです。その変更をノードの間に届け、順序をそろえるのはChirpsが受け持ちます。
ボードの関係はAlopex DB、変更の配送はAlopex Chirps。共同作業のサービスに、この組み合わせをおすすめします。