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

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

ただいまの
回答率

90.51%

  • PHP

    20349questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • SQL

    2391questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース設計

    145questions

    データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

facebookライクなSNSのDBテーブル構造について

解決済

回答 1

投稿

  • 評価
  • クリップ 4
  • VIEW 1,250

sika

score 34

現在、facebookライクのSNSをPHPで開発をするためのDB設計を行っています

仕様としてはfacebookの主要仕様をベースに考えています

  • 友達リクエスト → リクエスト認証されたら友達として紐付け
  • 自身の投稿の際に"自分のみ"、"友達のみ"、"全体"の公開範囲の設定が可能
  • 投稿にいいねボタンを押したカウント数とメンバーの一覧表示が可能
  • メッセンジャー機能やグループ機能などは現時点では不要

現在の懸念点

  • 投稿または返信コメントのリアルタイムな反映を考慮した場合にfirebaseの様なリアルタイム同期型データベースのサービスの導入は好手か悪手か?また導入した際に現在のテーブル構造はどうあるべきか?
  • 投稿に対して返信コメントがあり、さらにその返信に対してのコメントがあった場合の階層型としてのテーブルの持ち方をした場合に、出力の際のSQL構文が浮かばない(あまりに複雑になってしまう場合は直列型へ仕様を変更)
  • 友達テーブルでお互いの友達関係を紐付けるレコード数が「誰が」「誰を」という現在の構造では、お互いが友達という関係を証明するのにレコードが2行分必要な構造は無駄ではないのか?(後々に片方が友達削除した場合などを考えた際に更新処理が複雑になるのではないか?)

当方、複数のテーブルを用いた設計が初めてですので、上記の懸念点と下記テーブル構想に対してのご指摘・ご教授など頂ければ幸いです。

現在構想中のテーブル一覧です↓

【ユーザー情報table】『user_table』

u_id u_account u_pass u_mail u_lname u_fname u_thumb u_gender u_by u_bm u_bd u_hide u_remove u_signin
ユーザーID アカウント表記名 パスワード メールアドレス サムネイル画像 性別 誕生日(年) 誕生日(月) 誕生日(日) 退会状態フラグ 削除状態フラグ 登録日

【友達関係table】『freind_table』

f_id f_follow f_followers f_request f_approval
フレンドID フォロー側ユーザーID フォロワー側ユーザーID 友達申請フラグ 認証フラグ

【投稿関連table】『post_table』

p_id p_user p_date p_text p_img p_release p_like p_comment p_hide
コメントID 投稿ユーザーID 投稿日時 投稿内容 添付画像 公開範囲フラグ いいねカウント コメント数カウント 非表示フラグ

【返信コメントtable】『reply_table』

r_id r_post r_date r_user r_text r_img r_like r_comment r_emoji
返信ID 返信元コメントID 返信日時 返信ユーザーID 返信内容 添付画像 いいねカウント コメント数カウント 絵文字ナンバー

【いいねtable】『like_table』

l_id l_post l_reply l_user l_partner l_count l_date
いいねID 投稿ID 返信ID クリックユーザーID 相手ユーザーID カウント数 クリック日時
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

自分の最適化だとこうかな 関係ない情報は割愛してますが

 ユーザーを表す (users etc)

column--- type key         comment
id        int  PRIMARY KEY ユーザ  

※ RIMARY KEY(id)


 フォロー関係を表す (friends etc)

column    type key                     comment
id        int  FOREIGN KEY : users(id) ユーザ  
friend_id int  FOREIGN KEY : users(id) フォロ  

※ RIMARY KEY(id,friend_id)


 コメント投稿を表す (posts etc)

column--- type key                     comment
id        int  PRIMARY KEY             ポスト  
user_id   int  FOREIGN KEY : users(id) ユーザ  
parent_id int  FOREIGN KEY : users(id) 親記事  

※ parent_id = null が親記事 
※ RIMARY KEY(id)


 いいねを表す (favorites etc)

column    type key                     comment
id        int  FOREIGN KEY : users(id) ユーザ  
post_id   int  FOREIGN KEY : posts(id) フォロ  

※ RIMARY KEY(id,post_id)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/12 16:31

    ご回答ありがとうございます。
    FOREIGN KEYという物の存在は知っていましたが、こういう場合に用いるのですね!
    ご提案していただいた最適化テーブルをもとに再度設計を練り直してみたいと思います。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20349questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • SQL

    2391questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース設計

    145questions

    データベース設計はデータベースの論理的や物理的な部分を特定する工程です。