2014年9月4日木曜日

サービスにfork機能を付けたいときのテーブル設計


このエントリーをはてなブックマークに追加

動機

数年前に電子書籍サービスで二次創作、三次創作、、、とforkしていく機能を作る必要がありました。 親子関係を記録するテーブルのカラムに親のbook_idを保持していれば、自分の親と子供は簡単に取れますが、一族を全部取得したいという要望も出てくるかもしれない。

その場合、サブクエリで再帰的に〜は明らかに悪手。
で、ディレクトリ構造と一緒で、パスで表現すればいいな、と考えました。

pathカラムを追加

pathカラムを追加して、そこにbook_idを/で連結した値を格納。
"/1386/1521/1777"の場合、book_idが1777の本についてのfork情報で、1521が親で、さらにその親が1386。

メリット
パス形式にすると、自分の子孫レコードをパス同士の前方一致で見つけることができる。
index付きでlike検索が使えます。
注意事項
パスを格納するカラムの最大文字列長を確認しておく(大体杞憂に終わると思いますが)

0 件のコメント:

コメントを投稿