初心者で、出会った友人のプロフィールを作成していくWebアプリを作ろうと考えている者です。
項目 | 内容 |
---|---|
名前 | A子 |
年齢 | 25 |
誕生日 | 2000/09/09 |
どこで出会ったか | SNS |
いいところ | 顔 |
以上のような形で出会った、個人個人のプロフィールを書き記し、保存していくということをしたいです。アプリ上のUIだと上記の表のようにしたいと考えています。そして、上記の表でいう「項目」部分を、個人の裁量によって自由に増やしていきたいと考えているのですが、DB設計で止まっています。
方法として考えついたのが、
①自分の友人についてまとめたテーブルがあり、そこにデータを入れる
|ID|名前|誕生日|年齢|どこで出会ったか|いいところ|悪いところ|
|:--|:--|:--|:--|:--|:--|
|1|田中太郎|1990/02/02|22|SNS|イケメン|臭い|
|2|山田花子|1963/01/11|33|酒場|可愛い|臭い|
|3|伊藤カイジ|1996/11/22|44|草むら|勝負運がある|指がない|
|4|山崎俊朗|1990/02/03|55|マッチングアプリ|男前|女々しい|
上記のやり方は一番最初に考えた案です。
しかし、カラムを自由に追加することができない(100個とか1000個とか)と考えている。検索も遅そう。初心者目線で見てもなんとなく効率が悪そう(もっと効率のいいデータ設計があるはず)
また、アプリ所有者それぞれに新しいテーブルを作らなければならないのはなんとなく変だと感じました。そこで考えたのが次のような設計方法です。
②ユーザーID,友人ID、項目、内容をカラムとしたテーブルを作成する。
ユーザーID | 友人ID | 項目 | 内容 |
---|---|---|---|
1 | 1 | 名前 | 田中太郎 |
2 | 12 | 名前 | 田中次郎 |
1 | 5 | 趣味 | スキー |
3 | 10 | 誕生日 | 1990/02/02 |
上記のやり方は全てのユーザーの全ての友人が1つのテーブルに集まるという形になっています。
しかし、これだと項目を自由に増やすことはできますが、全てのユーザーの全ての友人が1つのテーブルに混ぜこぜになるので検索がしづらそうです。テーブルを役割ごとに分けることがいいとは分かっているのですが、どう分ければいいかが分かりません。
Toxi法なるDB設計がやりたいことに近いのではないか?と考えていますが、こんがらがってしまい、それなら質問をした方が早いと考え、質問をさせていただきました。
よろしくお願い致します。
追記
HouraijiICさんのご指摘から以下のような形に正規化することができました。
before
ユーザーID | 友人ID | 項目 | 内容 |
---|---|---|---|
1 | 1 | 名前 | A子 |
1 | 1 | 性別 | 女 |
1 | 2 | 名前 | B太 |
1 | 2 | 性別 | 男 |
2 | 3 | 名前 | C子 |
2 | 3 | 性別 | 女 |
2 | 4 | 名前 | D太 |
2 | 4 | 性別 | 男 |
これを正規化することで、
after
usersテーブル
ユーザーID | 友人ID |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 4 |
user_friendsテーブル
友人ID | 項目 | 内容 |
---|---|---|
1 | 名前 | A子 |
1 | 性別 | 女 |
2 | 名前 | B太 |
2 | 性別 | 男 |
3 | 名前 | C子 |
3 | 性別 | 女 |
4 | 名前 | D太 |
4 | 性別 | 男 |
これ以上細分化はできないと考えているのですが、考慮する点等はございますでしょうか?
追記 19/11/13
第3テーブルの議論についての補足の表を提示しました。
user_friendsテーブル(第2テーブル)
友人ID | 項目 | 内容 |
---|---|---|
1 | 1 | A子 |
1 | 2 | 女 |
2 | 1 | B太 |
2 | 2 | 男 |
3 | 1 | C子 |
3 | 2 | 女 |
4 | 1 | D太 |
4 | 2 | 男 |
項目テーブル(第3テーブル)
|名前|性別|趣味|特技|部活|備考|...
|:--|:--|:--|:--|:--|:--|
|1|2|3|4|5|6|...
追記 19/11/14
考えているうちに思考がこんがらがってしまったので、とりあえずER図にまとめました。記載していただいたER図と少し違う箇所があります。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/12 10:33 編集
2019/11/12 11:34 編集
2019/11/13 03:07 編集
2019/11/13 06:27 編集
2019/11/14 09:51 編集
2019/11/14 11:41 編集