質問: 現在、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 | カウント数 | クリック日時 |
回答: 自分の最適化だとこうかな 関係ない情報は割愛してますが ### ユーザーを表す (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)