質問: Slackで言葉遊びをするBOTを作っていて、前の言葉を記録しておくためにチームとチャンネルを特定して情報を保持しておきたいと思っているのですが、何の情報をキーにしたら良いのでしょうか。 `TeamId`, `ChannelId`, `ServiceId` あたりが関係しているのかなと思うのですが、いくつかチームがある中で、別のチームで同じChannelIdが使われていそうで、これだけで判断するのは良くないかなと思っています。ServiceIdがどのような情報なのか軽く調べたところでは見当たらず分かりませんでした。 TeamId と ChannelId を結合して保存しようとも思ったのですが、最悪の場合として `TeamId: "ABCD", ChannelId: "EFG"` と `TeamId: "ABC", ChannelId: "DEFG"` というケースがありえるのではと思いまして。 TeamId と ChannelId の両方を保持して判定するしかないのでしょうか・・・? 同じチーム内でも2つ以上のチャンネルで別のゲームが行われることも想定して、チームごとでの判定はしたくありません。 このような情報を必要としてるサービスはかなりあると思うのですが、どのように判定しているのでしょうか? ちなみに、Outgoing Webhooks と Azure Functions を使っていて、SQL Database に保存する予定です。そしてデータベースは完全初心者です・・・。
回答: > > TeamId と ChannelId を結合して保存しようとも思ったのですが、最悪の場合として TeamId: "ABCD", ChannelId: "EFG" と TeamId: "ABC", ChannelId: "DEFG" というケースがありえるのではと思いまして。 > > > 「とにかくTeamIdとChannelIdをまとめて管理したい!」ということであれば、TeamIdとChannelIdで絶対使用されない文字列で連結してはいかがでしょう? 例えば、 `|` という文字列がTeamIdとChannelIdで絶対に使用されない文字列だと仮定して、 ・TeamId: "ABCD", ChannelId: "EFG" は "ABCD|EFG" ・TeamId: "ABC", ChannelId: "DEFG" は "ABC|DEFG" となりますので、重複は発生しません。 > > TeamId と ChannelId の両方を保持して判定するしかないのでしょうか・・・? > > > 両方を保持して判定したくない理由が不明なので、なんとも言えませんが......。 一般的に「複数の項目(今回ならTeamIdとChannelId)でデータを特定する」場合、DB上にTeamIdとChannelIdを別項目として登録するかと思います。 そして、「特定のチーム&チャネルのデータだけを取得したい」となったら、SQLでデータを取得する際にWHERE句に条件を追加します。 ``` 例: word_game テーブルのデータが id team_id channel_id word_text created_at -- ------- ---------- ---------------------------- ---------------- 1 ABC DEFG たけやぶやけた 2018-06-15 12:00 2 ABCD EFG ねこがねこんだ 2018-06-15 12:01 3 ABC DEFG しんぶんし 2018-06-15 12:02 4 ABC DEFG わたしまけましたわ 2018-06-15 12:03 5 ABCD EFG あるみかんのうえにあるみかん 2018-06-15 12:04 となっている場合、 -- word_game テーブルから ABCチームのDEFGチャネルのデータを全て取得したい時に発行するSQL SELECT * FROM word_game WHERE team_id = 'ABC' AND channel_id = 'DEFG'; -- word_game テーブルから ABCDチームのEFGチャネルのデータのうち、最新のものだけを取得したい時に発行するSQL -- ※created_atの降順に並べ替えて(ORDER BY created_at DESC)、最初の1件だけ取得します(LIMIT 1) SELECT * FROM word_game WHERE team_id = 'ABCD' AND channel_id = 'EFG' ORDER BY created_at DESC LIMIT 1; ```