質問編集履歴

4

変更

2020/01/25 03:24

投稿

theearth
theearth

スコア11

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ###「いつ、何に、誰が」を持つテーブル
18
18
 
19
- こちらでは、「user_idが1さんがいいねしている記事」を取得するとき、「user_idが1の行」を複数探し、そこから「updated_at」や「article_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が1さんがいいねしている記事」を取得する速度が速いですよね。「user_idが1の行」は1つしかなく、その1つのdataを取得すれば済むからです。
45
+ こちらならば、「user_idが2さんがいいねしている記事」を取得する速度が速いですよね。
46
+
47
+
48
+
49
+ 「user_idが2の行」は1つしかなく(下記は見やすく2行にはしていますけど)、その1つのdataを取得すれば済むからです。
46
50
 
47
51
 
48
52
 

3

変更

2020/01/25 03:24

投稿

theearth
theearth

スコア11

test CHANGED
@@ -1 +1 @@
1
- Wordpressで作るブックマークシステムのデータベース設計について
1
+ DB設計について、「いつ、何に、誰が」を持つテーブルよりも、「誰が、その他の情報」という方がいいのではないか?
test CHANGED
@@ -1,157 +1,71 @@
1
- Wordpressを使「特定ページのタイトルと画像をブックマークきるシステム」を作っています。
1
+ よくある「いね機能」などDB設計質問があります。
2
2
 
3
3
 
4
4
 
5
- データーベース設計で悩んでるのですが、方法1と2ではどちらがぜ好ましでしょうか?
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
- 'url' => 'http://a.com/apple',
59
+ +----+-------------------------------------------------------+---------+
36
60
 
37
- 'thumbnail => 'http://a.com/images/apple1.jpg',
61
+ | 1 | [{"updated_at":"2020-01-25 12:35:43","article_id":1}] | 1 |
38
62
 
39
- 'title' => 'サイトA',
63
+ | 2 | [{"updated_at":"2020-01-25 12:35:44","article_id":1}, | 2 |
40
64
 
41
- 'bookmark_date' => '2010/10/10'
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
- 'url' => 'http://b.com/banana',
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

【概要】と【例】を追加

2020/01/25 03:21

投稿

theearth
theearth

スコア11

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

ユーザー→太郎としました

2020/01/21 07:08

投稿

theearth
theearth

スコア11

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
- そしてユーザーのカスタムフィールドに、上のbookmark_idと日を持たせる方法です。
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では、ユーザーのカスタムフィールドから記事IDを取得し、そのIDに基づいてカスタム投稿のカスタムフィールドから情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
129
+ 対して方法2では、太郎のカスタムフィールドからbookmark_idを取得し、そのbookmark_idであるカスタム投稿のカスタムフィールドから情報を読まないといけないので遅くなります。しかし同じデータが存在しなくて済むというメリットがあります。
126
130
 
127
131
 
128
132