回答編集履歴

4

追記

2020/06/29 14:29

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -11,6 +11,10 @@
11
11
  --
12
12
 
13
13
  質問の内容から、用いられるSQLは以下を想定されているのだと思います。
14
+
15
+ A.
16
+
17
+ --
14
18
 
15
19
  ```SQL
16
20
 
@@ -31,6 +35,10 @@
31
35
  この場合、外部キー制約により片側一方が設定されない場合の値(例えば0)をmytable2 や3に値として登録しておく必要があります。
32
36
 
33
37
 
38
+
39
+ B.
40
+
41
+ --
34
42
 
35
43
  テーブル構造を
36
44
 
@@ -67,3 +75,39 @@
67
75
  on t1.type=1 and t1.mytable_ID=t3.id
68
76
 
69
77
  ```
78
+
79
+ **A.**の問い合わせに関して適切にインデックスを適用しようとするなら
80
+
81
+ `(mytable2_ID)`,`(mytable3_ID)`の2つのインデックスが必要です。
82
+
83
+ ※`(mytable2_ID , mytable3_ID)`のインデックスでは効率的ではありません。
84
+
85
+ この2つのインデックスを適用する為にはunionを使用する必要があります。
86
+
87
+ ```
88
+
89
+ select ~
90
+
91
+ from mytable1 t1
92
+
93
+ inner join mytable2 t2
94
+
95
+ on t1.mytable2_ID=t2.id
96
+
97
+ union all
98
+
99
+ select ~
100
+
101
+ from mytable1 t1
102
+
103
+ inner join mytable3 t3
104
+
105
+ on t1.mytable3_ID=t3.id
106
+
107
+ ```
108
+
109
+ union ですから、当然select項目は数を合わせなければなりません。
110
+
111
+
112
+
113
+ 一方、**B.**の問い合わせ関しては、`(type, mytable_ID)`のインデックスを用意するだけです。

3

推敲

2020/06/29 14:29

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -1,9 +1,3 @@
1
- 値が与えられなければ、必然的にNUllになるので、敢えて指定する必要は無く、また敢えてDEFAULT Nullにする場面は思いつきません。
2
-
3
-
4
-
5
- 例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
6
-
7
1
  値が与えられなければ、必然的にNUllになるので、敢えて指定する必要は無く、また敢えてDEFAULT Nullにする場面は思いつきません。
8
2
 
9
3
 

2

推敲

2020/06/29 09:48

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  --
18
18
 
19
- 質問の内容から、用いられるSQLは以下を想定されいるのだと思います。
19
+ 質問の内容から、用いられるSQLは以下を想定されいるのだと思います。
20
20
 
21
21
  ```SQL
22
22
 

1

追記

2020/06/29 09:46

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -3,3 +3,73 @@
3
3
 
4
4
 
5
5
  例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
6
+
7
+ 値が与えられなければ、必然的にNUllになるので、敢えて指定する必要は無く、また敢えてDEFAULT Nullにする場面は思いつきません。
8
+
9
+
10
+
11
+ 例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
12
+
13
+
14
+
15
+ 追記
16
+
17
+ --
18
+
19
+ 質問の内容から、用いられるSQLは以下を想定されいるのだと思います。
20
+
21
+ ```SQL
22
+
23
+ select *
24
+
25
+ from mytable1 t1
26
+
27
+ left join mytable2 t2
28
+
29
+ on t1.mytable2_ID=t2.id
30
+
31
+ left join mytable3 t3
32
+
33
+ on t1.mytable3_ID=t3.id
34
+
35
+ ```
36
+
37
+ この場合、外部キー制約により片側一方が設定されない場合の値(例えば0)をmytable2 や3に値として登録しておく必要があります。
38
+
39
+
40
+
41
+ テーブル構造を
42
+
43
+ ```SQL
44
+
45
+ CREATE TABLE IF NOT EXISTS mytable1 (
46
+
47
+ ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
48
+
49
+ type int(1) not null, -- mytable_idの参照先(0:mytable2, 1:mytable3)
50
+
51
+ mytable_ID INT(10) not null
52
+
53
+ )
54
+
55
+ ```
56
+
57
+ のようにした場合、外部キーの設定はできませんが、必須が担保されるので、default値は不要になります。
58
+
59
+ また、問い合わせは以下の様になります。
60
+
61
+ ```SQL
62
+
63
+ select *
64
+
65
+ from mytable1 t1
66
+
67
+ left join mytable2 t2
68
+
69
+ on t1.type=0 and t1.mytable_ID=t2.id
70
+
71
+ left join mytable3 t3
72
+
73
+ on t1.type=1 and t1.mytable_ID=t3.id
74
+
75
+ ```