質問: この様な表があったとします。 **users** | ID(Pkey) | なまえ | 登録 | | --- | --- | --- | | 1 | イッチ | 2019/1/1 | | 2 | ニッチ | 2019/1/4 | | 3 | サッチ | 2019/1/5 | | 4 | ヨッチ | 2019/2/1 | これに相互がフレンド申請ののち友達になった関係を表したいです。 | ID | 友達A | 友達B | | --- | --- | --- | | 1 | 1 | 2 | | 2 | 1 | 3 | | 3 | 4 | 1 | この図では、1と2,1と3,1と4がそれぞれフレンド状態であることを表しています。 一人一人テーブルを作るのも効率がかなり悪そうですが、 いちいち友達Aと友達Bを参照しないとフレンドが 検索できないのもどうもスッキリせずもっといい方法はないものかと考えています。 この様な状況ならみなさんはどういうテーブルを作りますか? これしかないのか、他にどういう手があるのか教えていただけると幸いです。
回答: rdbでやるなら、その表のカラムを、友達A、友達Bではなく、src,dstにして、片方向一レコードで表現しますね。 相互になれば左右の違うペアができる。 検索とのことですが、だいたいフレンドを探すときには、出発点がいるので、特定の人からしか検索できない、は実用上あまりデメリットにならないと思います。 もし、アプリとしての友達にDMが送れるとかって機能のためでなく、関係性分析をするために、ある人の友達の友達の友達がどうなるかみたいな検索がしたいなら、その部分グラフdb使うと思います。ただ、もしグラフを使うとしても上記のような多対多モデルのrdb上のデータがあればデータを作るのにも使えるので、とりあえずはこの方向でつくるのでよいかと。