質問編集履歴
4
変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
|
9
9
|
###「いつ、何に、誰が」を持つテーブル
|
10
|
-
こちらでは、「user_idが
|
10
|
+
こちらでは、「user_idが2さんがいいねしている記事」を取得するとき、「user_idが2の行」を複数探し、そこから「updated_at」や「article_id」など複数の列を取得してこなければなりません。
|
11
11
|
```
|
12
12
|
+----+---------------------+------------+---------+
|
13
13
|
| id | updated_at | article_id | user_id |
|
@@ -20,8 +20,10 @@
|
|
20
20
|
```
|
21
21
|
|
22
22
|
###「誰が、その他の情報」を持つテーブル
|
23
|
-
こちらならば、「user_idが
|
23
|
+
こちらならば、「user_idが2さんがいいねしている記事」を取得する速度が速いですよね。
|
24
24
|
|
25
|
+
「user_idが2の行」は1つしかなく(下記は見やすく2行にはしていますけど)、その1つのdataを取得すれば済むからです。
|
26
|
+
|
25
27
|
同様に削除も更新も何もかもこちらの方が早いような気がするのですが、どうなのでしょうか。なぜこちらより上の設計が用いられるのか妥当な理由を知りたいです。
|
26
28
|
|
27
29
|
```
|
3
変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
DB設計について、「いつ、何に、誰が」を持つテーブルよりも、「誰が、その他の情報」という方がいいのではないか?
|
body
CHANGED
@@ -1,79 +1,36 @@
|
|
1
|
-
|
1
|
+
よくある「いいね機能」などのDB設計で質問があります。
|
2
2
|
|
3
|
-
|
3
|
+
「いつ、何に、誰が」を持つテーブルよりも、「誰が、その他の情報」という方がいいのではないか?という考えなのですが、
|
4
4
|
|
5
|
+
なぜ前者が用いられるのでしょうか?
|
5
6
|
|
6
|
-
###方法1
|
7
|
-
【概要】
|
8
|
-
ユーザーがブックマーク情報を全て持つ方法
|
9
7
|
|
10
|
-
【例】
|
11
|
-
太郎がサイトAとBをブックマークしたとします。
|
12
|
-
すると以下のように、太郎のカスタムフィールドに、ブックマーク情報と、あと保存日を持たせる方法です。
|
13
8
|
|
14
|
-
|
9
|
+
###「いつ、何に、誰が」を持つテーブル
|
10
|
+
こちらでは、「user_idが1さんがいいねしている記事」を取得するとき、「user_idが1の行」を複数探し、そこから「updated_at」や「article_id」など複数の列を取得してこなければなりません。
|
15
11
|
```
|
16
|
-
[
|
17
|
-
[
|
18
|
-
|
12
|
+
+----+---------------------+------------+---------+
|
19
|
-
'thumbnail => 'http://a.com/images/apple1.jpg',
|
20
|
-
|
13
|
+
| id | updated_at | article_id | user_id |
|
14
|
+
+----+---------------------+------------+---------+
|
15
|
+
| 1 | 2020-01-25 12:35:43 | 1 | 1 |
|
21
|
-
|
16
|
+
| 2 | 2020-01-25 12:35:44 | 1 | 2 |
|
22
|
-
],
|
23
|
-
[
|
24
|
-
|
17
|
+
| 3 | 2020-01-25 12:35:44 | 1 | 3 |
|
25
|
-
'thumbnail => 'http://b.com/images/banana1.jpg',
|
26
|
-
|
18
|
+
| 5 | 2020-01-25 12:36:16 | 2 | 2 |
|
27
|
-
|
19
|
+
+----+---------------------+------------+---------+
|
28
|
-
],
|
29
|
-
]
|
30
20
|
```
|
31
21
|
|
32
|
-
###方法2
|
33
|
-
【概要】
|
34
|
-
|
22
|
+
###「誰が、その他の情報」を持つテーブル
|
23
|
+
こちらならば、「user_idが1さんがいいねしている記事」を取得する速度が速いですよね。「user_idが1の行」は1つしかなく、その1つのdataを取得すれば済むからです。
|
35
24
|
|
36
|
-
【例】
|
37
|
-
太郎がサイトAとBをブックマークしたとします。
|
38
|
-
|
25
|
+
同様に削除も更新も何もかもこちらの方が早いような気がするのですが、どうなのでしょうか。なぜこちらより上の設計が用いられるのか妥当な理由を知りたいです。
|
39
26
|
|
40
|
-
▽bookmark_idが10の記事を投稿し、そのカスタムフィールドに以下を保存する
|
41
27
|
```
|
42
|
-
|
28
|
+
+----+-------------------------------------------------------+---------+
|
43
|
-
|
29
|
+
| id | data | user_id |
|
30
|
+
+----+-------------------------------------------------------+---------+
|
31
|
+
| 1 | [{"updated_at":"2020-01-25 12:35:43","article_id":1}] | 1 |
|
44
|
-
|
32
|
+
| 2 | [{"updated_at":"2020-01-25 12:35:44","article_id":1}, | 2 |
|
45
|
-
|
33
|
+
| | {"updated_at":"2020-01-25 12:36:16","article_id":2}] | |
|
46
|
-
|
34
|
+
| 3 | [{"updated_at":"2020-01-25 12:35:44","article_id":1}] | 3 |
|
35
|
+
+----+-------------------------------------------------------+---------+
|
47
|
-
```
|
36
|
+
```
|
48
|
-
▽bookmark_idが11の記事を投稿し、そのカスタムフィールドに以下を保存する
|
49
|
-
```
|
50
|
-
[
|
51
|
-
'url' => 'http://b.com/banana',
|
52
|
-
'thumbnail => 'http://b.com/images/banana1.jpg',
|
53
|
-
'title' => 'サイトB'
|
54
|
-
],
|
55
|
-
```
|
56
|
-
そして太郎のカスタムフィールドに、上のbookmark_idと保存日を持たせる方法です。
|
57
|
-
```
|
58
|
-
[
|
59
|
-
[
|
60
|
-
'bookmark_id' => 10,
|
61
|
-
'bookmark_date' => '2010/10/10'
|
62
|
-
],
|
63
|
-
[
|
64
|
-
'bookmark_id' => 11,
|
65
|
-
'bookmark_date' => '2011/11/11'
|
66
|
-
],
|
67
|
-
]
|
68
|
-
```
|
69
|
-
###特に悩んでいる点
|
70
|
-
|
71
|
-
方法1では、太郎の画面に「ブックマークリスト」を表示する速度が速いというメリットがあります。太郎のカスタムフィールドを読めばいいだけだからです。
|
72
|
-
|
73
|
-
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idである記事のカスタムフィールドからブックマーク情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
|
74
|
-
|
75
|
-
……悩んでいます。
|
76
|
-
|
77
|
-
ぞの他、決め手となるようなメリットデメリットについてあれば知りたいのですが、そのあたりについてご意見いただけませんでしょうか。
|
78
|
-
|
79
|
-
設計のポイントとしては手間、速度、管理とあるかと思いますが、今回は手間は二の次としたいと思っています。
|
2
【概要】と【例】を追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,8 +4,12 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
###方法1
|
7
|
+
【概要】
|
8
|
+
ユーザーがブックマーク情報を全て持つ方法
|
9
|
+
|
10
|
+
【例】
|
7
11
|
太郎がサイトAとBをブックマークしたとします。
|
8
|
-
すると以下のように、太郎のカスタムフィールドに、ブックマーク
|
12
|
+
すると以下のように、太郎のカスタムフィールドに、ブックマーク情報と、あと保存日を持たせる方法です。
|
9
13
|
|
10
14
|
|
11
15
|
```
|
@@ -26,8 +30,12 @@
|
|
26
30
|
```
|
27
31
|
|
28
32
|
###方法2
|
33
|
+
【概要】
|
34
|
+
記事がブックマーク情報を持ち、ユーザーはその記事IDを持つ方法
|
35
|
+
|
36
|
+
【例】
|
29
37
|
太郎がサイトAとBをブックマークしたとします。
|
30
|
-
すると以下のように、ブックマーク
|
38
|
+
すると以下のように、ブックマーク情報をカスタムフィールドに持つ記事を投稿して、
|
31
39
|
|
32
40
|
▽bookmark_idが10の記事を投稿し、そのカスタムフィールドに以下を保存する
|
33
41
|
```
|
@@ -60,9 +68,9 @@
|
|
60
68
|
```
|
61
69
|
###特に悩んでいる点
|
62
70
|
|
63
|
-
方法1では、太郎のブックマークリストを
|
71
|
+
方法1では、太郎の画面に「ブックマークリスト」を表示する速度が速いというメリットがあります。太郎のカスタムフィールドを読めばいいだけだからです。
|
64
72
|
|
65
|
-
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idである
|
73
|
+
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idである記事のカスタムフィールドからブックマーク情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
|
66
74
|
|
67
75
|
……悩んでいます。
|
68
76
|
|
1
ユーザー→太郎としました
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,7 +4,8 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
###方法1
|
7
|
+
太郎がサイトAとBをブックマークしたとします。
|
7
|
-
|
8
|
+
すると以下のように、太郎のカスタムフィールドに、ブックマークしたページの情報と、あと保存日を持たせる方法です。
|
8
9
|
|
9
10
|
|
10
11
|
```
|
@@ -25,9 +26,10 @@
|
|
25
26
|
```
|
26
27
|
|
27
28
|
###方法2
|
29
|
+
太郎がサイトAとBをブックマークしたとします。
|
28
|
-
|
30
|
+
すると以下のように、ブックマークしたページの情報をカスタムフィールドに持つ記事を投稿して、
|
29
31
|
|
30
|
-
▽bookmark_idが10の記事のカスタムフィールドに保存する
|
32
|
+
▽bookmark_idが10の記事を投稿し、そのカスタムフィールドに以下を保存する
|
31
33
|
```
|
32
34
|
[
|
33
35
|
'url' => 'http://a.com/apple',
|
@@ -35,7 +37,7 @@
|
|
35
37
|
'title' => 'サイトA'
|
36
38
|
],
|
37
39
|
```
|
38
|
-
▽bookmark_idが11の記事のカスタムフィールドに保存する
|
40
|
+
▽bookmark_idが11の記事を投稿し、そのカスタムフィールドに以下を保存する
|
39
41
|
```
|
40
42
|
[
|
41
43
|
'url' => 'http://b.com/banana',
|
@@ -43,7 +45,7 @@
|
|
43
45
|
'title' => 'サイトB'
|
44
46
|
],
|
45
47
|
```
|
46
|
-
そして
|
48
|
+
そして太郎のカスタムフィールドに、上のbookmark_idと保存日を持たせる方法です。
|
47
49
|
```
|
48
50
|
[
|
49
51
|
[
|
@@ -58,9 +60,9 @@
|
|
58
60
|
```
|
59
61
|
###特に悩んでいる点
|
60
62
|
|
61
|
-
方法1では、
|
63
|
+
方法1では、太郎のブックマークリストを読み込む速度が速いというメリットがあります。太郎のカスタムフィールドを読めばいいだけだからです。
|
62
64
|
|
63
|
-
対して方法2では、
|
65
|
+
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idであるカスタム投稿のカスタムフィールドから情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
|
64
66
|
|
65
67
|
……悩んでいます。
|
66
68
|
|