Help us understand the problem. What is going on with this article?

タグ機能を持つユーザー-プロジェクトのSNSのDB設計

More than 1 year has passed since last update.

はじめに

[ある目的を持った人たちが仲間探しのためにプロジェクト(チーム)を作成、参加できるSNS]のプロトタイプ作成でチームで考案したデータベース設計を備忘録として残しておく。
プロトタイプであるため最低限必要なデータのみで構成した。

概要

ユーザーとプロジェクトが存在し、それぞれ関連するタグ付けを行うことができ、ユーザーはプロジェクトに参加申請したり、作成することができる。

仕様

・ユーザーログイン機能
・タグ機能 -> ユーザー、プロジェクトに関連するタグ付けを行うことができる(Qiitaのタグ付け機能に近い)
・ユーザープロフィール機能(紹介文、タグ)
・プロジェクトへの参加申請、承認機能

データベース

MySQL

image.png

基礎要素

エンティティ

  • ユーザー
  • プロジェクト
  • タグ

スクリーンショット 2018-09-19 16.50.50.png

属性

スクリーンショット 2018-09-19 16.50.57.png

関連(リレーション)、関連の多重度

スクリーンショット 2018-09-19 16.51.03.png

エンティティ同士の関連性はユーザー、プロジェクト、タグそれぞれすべて多対多の関係であるため、それぞれの関連性について中間テーブルを用意することで解決する。

【中間テーブルを利用した関連】

スクリーンショット 2018-09-19 16.51.09.png

テーブル設計

【ユーザ情報table】 users

user_id   user_name mail introduction password github_URL
ユーザーID ユーザー名 メールアドレス 紹介文 パスワード GithubのプロフィールURL

【プロジェクト情報テーブル】 projects

project_id   project_name admin_user_id introduction private
プロジェクトID プロジェクト名 管理者のユーザーID 紹介文 公開設定

【ユーザーとプロジェクトの関連性テーブル】 user_project

user_project_id   user_id project_id state
プロジェクトとユーザーの関連性を表すID ユーザーのID プロジェクトID ユーザーとプロジェクトの関係を表す(申請中、承認済み、拒否済み)

【タグ情報テーブル】 tags

tag_id   tag_name
タグのID タグの名前

【タグとユーザー、プロジェクトの関連性テーブル】 tag_user_project

tag_user_project_id   tag_id target_id target_type
タグとユーザーまたはプロジェクトの関連性を表すID タグのID ターゲット(ユーザーorプロジェクト)のID ターゲットの種類(ユーザーorプロジェクト)

【参考】クエリ

ユーザーが属しているプロジェクトの名前を出力するクエリ

例)user_id = 1のユーザーが参加しているプロジェクト一覧

SELECT project_name
FROM projects
LEFT JOIN user_project ON projects.project_id = user_project.project_id
WHERE user_id = "1" AND user_project.state = "approved";

※state="approved"はユーザーがプロジェクト参加申請が承認済みであることを示す

ユーザーにつけられているタグを出力するクエリ

例)user_id = 1のユーザーにつけられているタグ一覧

SELECT tag_name
FROM tag_user_project
LEFT JOIN tags ON tags.tag_id = tag_user_project.tag_id
WHERE target_id = "1" AND target_type = "user_id";

参考サイト

kotap15
zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away