teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

変更

2020/01/25 03:24

投稿

theearth
theearth

スコア11

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
 
9
9
  ###「いつ、何に、誰が」を持つテーブル
10
- こちらでは、「user_idが1さんがいいねしている記事」を取得するとき、「user_idが1の行」を複数探し、そこから「updated_at」や「article_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が1さんがいいねしている記事」を取得する速度が速いですよね。「user_idが1の行」は1つしかなく、その1つのdataを取得すれば済むからです。
23
+ こちらならば、「user_idが2さんがいいねしている記事」を取得する速度が速いですよね。
24
24
 
25
+ 「user_idが2の行」は1つしかなく(下記は見やすく2行にはしていますけど)、その1つのdataを取得すれば済むからです。
26
+
25
27
  同様に削除も更新も何もかもこちらの方が早いような気がするのですが、どうなのでしょうか。なぜこちらより上の設計が用いられるのか妥当な理由を知りたいです。
26
28
 
27
29
  ```

3

変更

2020/01/25 03:24

投稿

theearth
theearth

スコア11

title CHANGED
@@ -1,1 +1,1 @@
1
- Wordpressで作るブックマークシステムのデータベース設計について
1
+ DB設計について、「いつ、何に、誰が」を持つテーブルよりも、「誰が、その他の情報」という方がいいのではないか?
body CHANGED
@@ -1,79 +1,36 @@
1
- Wordpressを使い特定ページのタイトルと画像をブックマークきるシステム」を作っています。
1
+ よくあるいいね機能」などDB設計質問があります。
2
2
 
3
- データーベース設計で悩んでるのですが、方法1ではどちらがぜ好ましでしょうか?
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
- 'url' => 'http://a.com/apple',
12
+ +----+---------------------+------------+---------+
19
- 'thumbnail => 'http://a.com/images/apple1.jpg',
20
- 'title' => 'サイトA',
13
+ | id | updated_at | article_id | user_id |
14
+ +----+---------------------+------------+---------+
15
+ | 1 | 2020-01-25 12:35:43 | 1 | 1 |
21
- 'bookmark_date' => '2010/10/10'
16
+ | 2 | 2020-01-25 12:35:44 | 1 | 2 |
22
- ],
23
- [
24
- 'url' => 'http://b.com/banana',
17
+ | 3 | 2020-01-25 12:35:44 | 1 | 3 |
25
- 'thumbnail => 'http://b.com/images/banana1.jpg',
26
- 'title' => 'サイトB',
18
+ | 5 | 2020-01-25 12:36:16 | 2 | 2 |
27
- 'bookmark_date' => '2011/11/11'
19
+ +----+---------------------+------------+---------+
28
- ],
29
- ]
30
20
  ```
31
21
 
32
- ###方法2
33
- 【概要】
34
- 記事ブックマーク情報を持ちユーザーはその記事IDを持つ方法
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
- 'url' => 'http://a.com/apple',
29
+ | id | data | user_id |
30
+ +----+-------------------------------------------------------+---------+
31
+ | 1 | [{"updated_at":"2020-01-25 12:35:43","article_id":1}] | 1 |
44
- 'thumbnail => 'http://a.com/images/apple1.jpg',
32
+ | 2 | [{"updated_at":"2020-01-25 12:35:44","article_id":1}, | 2 |
45
- 'title' => 'サイトA'
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

【概要】と【例】を追加

2020/01/25 03:21

投稿

theearth
theearth

スコア11

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

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

2020/01/21 07:08

投稿

theearth
theearth

スコア11

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