質問編集履歴
4
変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
###「いつ、何に、誰が」を持つテーブル
|
18
18
|
|
19
|
-
こちらでは、「user_idが
|
19
|
+
こちらでは、「user_idが2さんがいいねしている記事」を取得するとき、「user_idが2の行」を複数探し、そこから「updated_at」や「article_id」など複数の列を取得してこなければなりません。
|
20
20
|
|
21
21
|
```
|
22
22
|
|
@@ -42,7 +42,11 @@
|
|
42
42
|
|
43
43
|
###「誰が、その他の情報」を持つテーブル
|
44
44
|
|
45
|
-
こちらならば、「user_idが
|
45
|
+
こちらならば、「user_idが2さんがいいねしている記事」を取得する速度が速いですよね。
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
「user_idが2の行」は1つしかなく(下記は見やすく2行にはしていますけど)、その1つのdataを取得すれば済むからです。
|
46
50
|
|
47
51
|
|
48
52
|
|
3
変更
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
DB設計について、「いつ、何に、誰が」を持つテーブルよりも、「誰が、その他の情報」という方がいいのではないか?
|
test
CHANGED
@@ -1,157 +1,71 @@
|
|
1
|
-
|
1
|
+
よくある「いいね機能」などのDB設計で質問があります。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
「いつ、何に、誰が」を持つテーブルよりも、「誰が、その他の情報」という方がいいのではないか?という考えなのですが、
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
なぜ前者が用いられるのでしょうか?
|
6
10
|
|
7
11
|
|
8
12
|
|
9
13
|
|
10
14
|
|
11
|
-
###方法1
|
12
15
|
|
13
|
-
【概要】
|
14
16
|
|
15
|
-
|
17
|
+
###「いつ、何に、誰が」を持つテーブル
|
18
|
+
|
19
|
+
こちらでは、「user_idが1さんがいいねしている記事」を取得するとき、「user_idが1の行」を複数探し、そこから「updated_at」や「article_id」など複数の列を取得してこなければなりません。
|
20
|
+
|
21
|
+
```
|
22
|
+
|
23
|
+
+----+---------------------+------------+---------+
|
24
|
+
|
25
|
+
| id | updated_at | article_id | user_id |
|
26
|
+
|
27
|
+
+----+---------------------+------------+---------+
|
28
|
+
|
29
|
+
| 1 | 2020-01-25 12:35:43 | 1 | 1 |
|
30
|
+
|
31
|
+
| 2 | 2020-01-25 12:35:44 | 1 | 2 |
|
32
|
+
|
33
|
+
| 3 | 2020-01-25 12:35:44 | 1 | 3 |
|
34
|
+
|
35
|
+
| 5 | 2020-01-25 12:36:16 | 2 | 2 |
|
36
|
+
|
37
|
+
+----+---------------------+------------+---------+
|
38
|
+
|
39
|
+
```
|
16
40
|
|
17
41
|
|
18
42
|
|
19
|
-
|
43
|
+
###「誰が、その他の情報」を持つテーブル
|
20
44
|
|
21
|
-
太郎がサイトAとBをブックマークしたとします。
|
22
|
-
|
23
|
-
する
|
45
|
+
こちらならば、「user_idが1さんがいいねしている記事」を取得する速度が速いですよね。「user_idが1の行」は1つしかなく、その1つのdataを取得すれば済むからです。
|
24
46
|
|
25
47
|
|
48
|
+
|
49
|
+
同様に削除も更新も何もかもこちらの方が早いような気がするのですが、どうなのでしょうか。なぜこちらより上の設計が用いられるのか妥当な理由を知りたいです。
|
26
50
|
|
27
51
|
|
28
52
|
|
29
53
|
```
|
30
54
|
|
31
|
-
|
55
|
+
+----+-------------------------------------------------------+---------+
|
32
56
|
|
33
|
-
|
57
|
+
| id | data | user_id |
|
34
58
|
|
35
|
-
|
59
|
+
+----+-------------------------------------------------------+---------+
|
36
60
|
|
37
|
-
|
61
|
+
| 1 | [{"updated_at":"2020-01-25 12:35:43","article_id":1}] | 1 |
|
38
62
|
|
39
|
-
|
63
|
+
| 2 | [{"updated_at":"2020-01-25 12:35:44","article_id":1}, | 2 |
|
40
64
|
|
41
|
-
|
65
|
+
| | {"updated_at":"2020-01-25 12:36:16","article_id":2}] | |
|
42
66
|
|
43
|
-
]
|
67
|
+
| 3 | [{"updated_at":"2020-01-25 12:35:44","article_id":1}] | 3 |
|
44
68
|
|
45
|
-
[
|
46
|
-
|
47
|
-
|
69
|
+
+----+-------------------------------------------------------+---------+
|
48
|
-
|
49
|
-
'thumbnail => 'http://b.com/images/banana1.jpg',
|
50
|
-
|
51
|
-
'title' => 'サイトB',
|
52
|
-
|
53
|
-
'bookmark_date' => '2011/11/11'
|
54
|
-
|
55
|
-
],
|
56
|
-
|
57
|
-
]
|
58
70
|
|
59
71
|
```
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
###方法2
|
64
|
-
|
65
|
-
【概要】
|
66
|
-
|
67
|
-
記事がブックマーク情報を持ち、ユーザーはその記事IDを持つ方法
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
【例】
|
72
|
-
|
73
|
-
太郎がサイトAとBをブックマークしたとします。
|
74
|
-
|
75
|
-
すると以下のように、ブックマーク情報をカスタムフィールドに持つ記事を投稿して、
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
▽bookmark_idが10の記事を投稿し、そのカスタムフィールドに以下を保存する
|
80
|
-
|
81
|
-
```
|
82
|
-
|
83
|
-
[
|
84
|
-
|
85
|
-
'url' => 'http://a.com/apple',
|
86
|
-
|
87
|
-
'thumbnail => 'http://a.com/images/apple1.jpg',
|
88
|
-
|
89
|
-
'title' => 'サイトA'
|
90
|
-
|
91
|
-
],
|
92
|
-
|
93
|
-
```
|
94
|
-
|
95
|
-
▽bookmark_idが11の記事を投稿し、そのカスタムフィールドに以下を保存する
|
96
|
-
|
97
|
-
```
|
98
|
-
|
99
|
-
[
|
100
|
-
|
101
|
-
'url' => 'http://b.com/banana',
|
102
|
-
|
103
|
-
'thumbnail => 'http://b.com/images/banana1.jpg',
|
104
|
-
|
105
|
-
'title' => 'サイトB'
|
106
|
-
|
107
|
-
],
|
108
|
-
|
109
|
-
```
|
110
|
-
|
111
|
-
そして太郎のカスタムフィールドに、上のbookmark_idと保存日を持たせる方法です。
|
112
|
-
|
113
|
-
```
|
114
|
-
|
115
|
-
[
|
116
|
-
|
117
|
-
[
|
118
|
-
|
119
|
-
'bookmark_id' => 10,
|
120
|
-
|
121
|
-
'bookmark_date' => '2010/10/10'
|
122
|
-
|
123
|
-
],
|
124
|
-
|
125
|
-
[
|
126
|
-
|
127
|
-
'bookmark_id' => 11,
|
128
|
-
|
129
|
-
'bookmark_date' => '2011/11/11'
|
130
|
-
|
131
|
-
],
|
132
|
-
|
133
|
-
]
|
134
|
-
|
135
|
-
```
|
136
|
-
|
137
|
-
###特に悩んでいる点
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
方法1では、太郎の画面に「ブックマークリスト」を表示する速度が速いというメリットがあります。太郎のカスタムフィールドを読めばいいだけだからです。
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idである記事のカスタムフィールドからブックマーク情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
……悩んでいます。
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
ぞの他、決め手となるようなメリットデメリットについてあれば知りたいのですが、そのあたりについてご意見いただけませんでしょうか。
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
設計のポイントとしては手間、速度、管理とあるかと思いますが、今回は手間は二の次としたいと思っています。
|
2
【概要】と【例】を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,9 +10,17 @@
|
|
10
10
|
|
11
11
|
###方法1
|
12
12
|
|
13
|
+
【概要】
|
14
|
+
|
15
|
+
ユーザーがブックマーク情報を全て持つ方法
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
【例】
|
20
|
+
|
13
21
|
太郎がサイトAとBをブックマークしたとします。
|
14
22
|
|
15
|
-
すると以下のように、太郎のカスタムフィールドに、ブックマーク
|
23
|
+
すると以下のように、太郎のカスタムフィールドに、ブックマーク情報と、あと保存日を持たせる方法です。
|
16
24
|
|
17
25
|
|
18
26
|
|
@@ -54,9 +62,17 @@
|
|
54
62
|
|
55
63
|
###方法2
|
56
64
|
|
65
|
+
【概要】
|
66
|
+
|
67
|
+
記事がブックマーク情報を持ち、ユーザーはその記事IDを持つ方法
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
【例】
|
72
|
+
|
57
73
|
太郎がサイトAとBをブックマークしたとします。
|
58
74
|
|
59
|
-
すると以下のように、ブックマーク
|
75
|
+
すると以下のように、ブックマーク情報をカスタムフィールドに持つ記事を投稿して、
|
60
76
|
|
61
77
|
|
62
78
|
|
@@ -122,11 +138,11 @@
|
|
122
138
|
|
123
139
|
|
124
140
|
|
125
|
-
方法1では、太郎のブックマークリストを
|
141
|
+
方法1では、太郎の画面に「ブックマークリスト」を表示する速度が速いというメリットがあります。太郎のカスタムフィールドを読めばいいだけだからです。
|
126
142
|
|
127
143
|
|
128
144
|
|
129
|
-
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idである
|
145
|
+
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idである記事のカスタムフィールドからブックマーク情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
|
130
146
|
|
131
147
|
|
132
148
|
|
1
ユーザー→太郎としました
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,7 +10,9 @@
|
|
10
10
|
|
11
11
|
###方法1
|
12
12
|
|
13
|
+
太郎がサイトAとBをブックマークしたとします。
|
14
|
+
|
13
|
-
|
15
|
+
すると以下のように、太郎のカスタムフィールドに、ブックマークしたページの情報と、あと保存日を持たせる方法です。
|
14
16
|
|
15
17
|
|
16
18
|
|
@@ -52,11 +54,13 @@
|
|
52
54
|
|
53
55
|
###方法2
|
54
56
|
|
57
|
+
太郎がサイトAとBをブックマークしたとします。
|
58
|
+
|
55
|
-
|
59
|
+
すると以下のように、ブックマークしたページの情報をカスタムフィールドに持つ記事を投稿して、
|
56
60
|
|
57
61
|
|
58
62
|
|
59
|
-
▽bookmark_idが10の記事のカスタムフィールドに保存する
|
63
|
+
▽bookmark_idが10の記事を投稿し、そのカスタムフィールドに以下を保存する
|
60
64
|
|
61
65
|
```
|
62
66
|
|
@@ -72,7 +76,7 @@
|
|
72
76
|
|
73
77
|
```
|
74
78
|
|
75
|
-
▽bookmark_idが11の記事のカスタムフィールドに保存する
|
79
|
+
▽bookmark_idが11の記事を投稿し、そのカスタムフィールドに以下を保存する
|
76
80
|
|
77
81
|
```
|
78
82
|
|
@@ -88,7 +92,7 @@
|
|
88
92
|
|
89
93
|
```
|
90
94
|
|
91
|
-
そして
|
95
|
+
そして太郎のカスタムフィールドに、上のbookmark_idと保存日を持たせる方法です。
|
92
96
|
|
93
97
|
```
|
94
98
|
|
@@ -118,11 +122,11 @@
|
|
118
122
|
|
119
123
|
|
120
124
|
|
121
|
-
方法1では、
|
125
|
+
方法1では、太郎のブックマークリストを読み込む速度が速いというメリットがあります。太郎のカスタムフィールドを読めばいいだけだからです。
|
122
126
|
|
123
127
|
|
124
128
|
|
125
|
-
対して方法2では、
|
129
|
+
対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idであるカスタム投稿のカスタムフィールドから情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
|
126
130
|
|
127
131
|
|
128
132
|
|