質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

4回答

17326閲覧

Twitterのクローンを作ろうとしています。データベース設計( ER図?)で行き詰まっています。

dongw

総合スコア119

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

2クリップ

投稿2016/12/16 07:32

編集2016/12/19 03:14

Ruby on Rails(mysql)でTwitterのクローンを作ろうとしています。
機能として必須のフォロー機能といいね機能を作ろうとしているのですが、データベース設計で自分だけで考えるには限界が来てしまいました。
現在でRT機能は考えていません。
アドバイスい頂けるとありがたいです。

Userテーブル

name
usersame
email
profile
icon_img
header_img

tweetテーブル

messages
user_id

favoriteテーブル

tweet_id
user_id

relationテーブル

user_id
follower_id
followered_id

followeredテーブル

user_id
followerテーブル

user_id

関係性

user1対多tweet
user1対多favorite
tweet1対多favorite
user多対多follower&followered

いいね機能のテーブルまでは大体合っている?と思っているのですが、
フォローフォロワーの機能の関連性が結構時間かけたのですが全くうまく掴めませんでした。
よろしくお願いいいたします。


追記
みなさま回答ありがとうございます
回答に個別に返信したいのですが、自分の実力不足もあり理解しきれていない点も多いです。
追記でお聞きしたいことがあります。
回答ではrelationテーブル一つだけでもフォロー、フォロワーの関連性とデータは取得できる、というお話でした。
これ以外にでも自分で検索してgithubのTwittercloneなどを見ていると、
relationsテーブルに
フォローとフォロワーのカラムが存在しているものが多く見受けられました。
ここでの回答だとuser_idとフォローされてるidがあればデータは取ってこれる、ということでしたが
フォローとフォロワーのid両方をrelationテーブルに入れても大丈夫なのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

followerとfolloweredを分ける必要性はあるでしょうか?をフォローしているよという情報さえあれば、問題無いと思います。例えば、relationテーブルはuser_idとfollower_idの2つを持つとします。user_idの人が、follower_idをフォローしているというイメージです。

もしuser_id=1192の人がフォローしているユーザーの一覧が欲しいという場合は

SQL

1SELECT 2 follower_id 3FROM 4 relation 5WHERE 6 user_id = '1192'

でとってこれます。
また、user_id=が1192の人をフォローしている人のリストをとってくる場合は

SQL

1SELECT 2 user_id 3FROM 4 relation 5WHERE 6 follower_id = '1192'

でとってこれます。

また、user_id=1192の人と相互フォローしている人を探したい場合は

SQL

1SELECT 2 user_id 3FROM 4 relation T1 5INNER JOIN 6 relation T2 7ON 8 T1.follower_id = T2.user_id 9WHERE 10 T1.user_id = '1192' 11AND 12 T2.follower_id = '1192'

でとってこれます。

こんな感じで、被フォロー情報が無くてもフォロー情報さえあればまかなえるかと

投稿2016/12/16 07:53

編集2016/12/16 08:01
hitsujimeeee

総合スコア486

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dongw

2016/12/24 08:26

ありがとうございます。 自分でも回答を元に調べてみたところ、大体のイメージが掴めました。 自分の知識不足により全員の回答にコメントをつけられませんが、一番わかりやすい回答を頂いたのでベストアンサーにしました。
guest

0

http://railstutorial.jp/chapters/following_users?version=5.0#cha-following_users
第14章 ユーザーをフォローする
が参考になるかも知れません。

投稿2016/12/16 14:41

pebble8888

総合スコア390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

user多対多follower&followeredが複雑にしているところですよね…
私なら
followerテーブル

user_id(userテーブルのuser_idとリンク)
follow(userがフォローしている人)

として、まずはuser 1 対 follower多とします。
(これで1人のユーザが多数の人をフォローできます。)

followeredテーブルはあえて作らず、特定のuserに対するフォロワーを表示する時には、followerテーブルをfollowで抽出して出す感じですかね…(select user_id from follower where follow = 特定のユーザID)

こんな感じで取れませんか?

投稿2016/12/16 07:49

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

relation,follower,followerdの3テーブルを持つのではなく
relationにuser_idとfollowered_id
(自分が誰をフォローしているか)
だけがあればいいと思います。
user_idをキーにfollowered_idを列挙すればfolloweredが
followered_idをキーにuser_idを列挙すればfollowerを得ることができます。

投稿2016/12/16 07:43

katsuya141

総合スコア367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsuya141

2016/12/16 07:44

あと、タイムスタンプは必須ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問