回答編集履歴
15
BIGINTを減らす
answer
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
|
29
29
|
```sql
|
30
30
|
CREATE TABLE users(
|
31
|
-
`id`
|
31
|
+
`id` INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
32
32
|
`main_access_token_id` BIGINT UNSIGNED NOT NULL UNIQUE,
|
33
33
|
`created_at` DATETIME NOT NULL,
|
34
34
|
`updated_at` DATETIME NOT NULL
|
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
CREATE TABLE credentials(
|
38
38
|
`id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
39
|
-
`user_id`
|
39
|
+
`user_id` INTEGER UNSIGNED NOT NULL,
|
40
40
|
`access_token` VARCHAR(60) NOT NULL UNIQUE,
|
41
41
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
42
42
|
`screen_name` VARCHAR(20) NOT NULL,
|
14
AI設定ミス
answer
CHANGED
@@ -28,14 +28,14 @@
|
|
28
28
|
|
29
29
|
```sql
|
30
30
|
CREATE TABLE users(
|
31
|
-
`id` BIGINT UNSIGNED PRIMARY KEY,
|
31
|
+
`id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
32
32
|
`main_access_token_id` BIGINT UNSIGNED NOT NULL UNIQUE,
|
33
33
|
`created_at` DATETIME NOT NULL,
|
34
34
|
`updated_at` DATETIME NOT NULL
|
35
35
|
);
|
36
36
|
|
37
37
|
CREATE TABLE credentials(
|
38
|
-
`id` BIGINT UNSIGNED
|
38
|
+
`id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
39
39
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
40
40
|
`access_token` VARCHAR(60) NOT NULL UNIQUE,
|
41
41
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
13
access_tokenだけUNIQUEあり
answer
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
```sql
|
9
9
|
CREATE TABLE users(
|
10
10
|
`id` BIGINT UNSIGNED PRIMARY KEY,
|
11
|
-
`access_token` VARCHAR(60) NOT NULL,
|
11
|
+
`access_token` VARCHAR(60) NOT NULL UNIQUE,
|
12
12
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
13
13
|
`screen_name` VARCHAR(20) NOT NULL,
|
14
14
|
`name` VARCHAR(25) NOT NULL,
|
@@ -37,7 +37,7 @@
|
|
37
37
|
CREATE TABLE credentials(
|
38
38
|
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
39
39
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
40
|
-
`access_token` VARCHAR(60) NOT NULL,
|
40
|
+
`access_token` VARCHAR(60) NOT NULL UNIQUE,
|
41
41
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
42
42
|
`screen_name` VARCHAR(20) NOT NULL,
|
43
43
|
`name` VARCHAR(25) NOT NULL,
|
12
UNIQUE解除
answer
CHANGED
@@ -8,9 +8,9 @@
|
|
8
8
|
```sql
|
9
9
|
CREATE TABLE users(
|
10
10
|
`id` BIGINT UNSIGNED PRIMARY KEY,
|
11
|
-
`access_token` VARCHAR(60) NOT NULL
|
11
|
+
`access_token` VARCHAR(60) NOT NULL,
|
12
12
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
13
|
-
`screen_name` VARCHAR(20) NOT NULL
|
13
|
+
`screen_name` VARCHAR(20) NOT NULL,
|
14
14
|
`name` VARCHAR(25) NOT NULL,
|
15
15
|
`description` VARCHAR(180) NOT NULL,
|
16
16
|
`created_at` DATETIME NOT NULL,
|
@@ -18,6 +18,8 @@
|
|
18
18
|
);
|
19
19
|
```
|
20
20
|
|
21
|
+
知らない間にscreen_nameが変更され,それが別の人のものに入れ替わっている可能性があるので,あえてUNIQUE制約は外しました。
|
22
|
+
|
21
23
|
> API Key の記録について
|
22
24
|
|
23
25
|
最初からユーザとAPIキーが1対1で結びつかないことがわかっている場合,テーブルは分けるべきだと思います。よほど大規模なサービスでない限り,その程度の結合コストがボトルネックになることはありません。JOIN句を使えばクエリは1個に収まりますし。
|
@@ -35,9 +37,9 @@
|
|
35
37
|
CREATE TABLE credentials(
|
36
38
|
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
37
39
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
38
|
-
`access_token` VARCHAR(60) NOT NULL
|
40
|
+
`access_token` VARCHAR(60) NOT NULL,
|
39
41
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
40
|
-
`screen_name` VARCHAR(20) NOT NULL
|
42
|
+
`screen_name` VARCHAR(20) NOT NULL,
|
41
43
|
`name` VARCHAR(25) NOT NULL,
|
42
44
|
`description` VARCHAR(180) NOT NULL,
|
43
45
|
`created_at` DATETIME NOT NULL,
|
11
fix
answer
CHANGED
@@ -8,9 +8,9 @@
|
|
8
8
|
```sql
|
9
9
|
CREATE TABLE users(
|
10
10
|
`id` BIGINT UNSIGNED PRIMARY KEY,
|
11
|
-
`access_token` VARCHAR(60)
|
11
|
+
`access_token` VARCHAR(60) NOT NULL UNIQUE ,
|
12
12
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
13
|
-
`screen_name` VARCHAR(20)
|
13
|
+
`screen_name` VARCHAR(20) NOT NULL UNIQUE ,
|
14
14
|
`name` VARCHAR(25) NOT NULL,
|
15
15
|
`description` VARCHAR(180) NOT NULL,
|
16
16
|
`created_at` DATETIME NOT NULL,
|
10
fix
answer
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
```sql
|
28
28
|
CREATE TABLE users(
|
29
29
|
`id` BIGINT UNSIGNED PRIMARY KEY,
|
30
|
-
`main_access_token_id` NOT NULL,
|
30
|
+
`main_access_token_id` BIGINT UNSIGNED NOT NULL UNIQUE,
|
31
31
|
`created_at` DATETIME NOT NULL,
|
32
32
|
`updated_at` DATETIME NOT NULL
|
33
33
|
);
|
@@ -35,9 +35,9 @@
|
|
35
35
|
CREATE TABLE credentials(
|
36
36
|
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
37
37
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
38
|
-
`access_token` VARCHAR(60)
|
38
|
+
`access_token` VARCHAR(60) NOT NULL UNIQUE,
|
39
39
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
40
|
-
`screen_name` VARCHAR(20)
|
40
|
+
`screen_name` VARCHAR(20) NOT NULL UNIQUE,
|
41
41
|
`name` VARCHAR(25) NOT NULL,
|
42
42
|
`description` VARCHAR(180) NOT NULL,
|
43
43
|
`created_at` DATETIME NOT NULL,
|
9
JOIN
answer
CHANGED
@@ -20,8 +20,10 @@
|
|
20
20
|
|
21
21
|
> API Key の記録について
|
22
22
|
|
23
|
-
最初からユーザとAPIキーが1対1で結びつかないことがわかっている場合,テーブルは分けるべきだと思います。よほど大規模なサービスでない限り,その程度の結合コストがボトルネックになることはありません。
|
23
|
+
最初からユーザとAPIキーが1対1で結びつかないことがわかっている場合,テーブルは分けるべきだと思います。よほど大規模なサービスでない限り,その程度の結合コストがボトルネックになることはありません。JOIN句を使えばクエリは1個に収まりますし。
|
24
24
|
|
25
|
+
それこそこの程度でボトルネックになってしまうのであれば,(綿密な設計を行った上で)ストレージとしてMySQLの代わりにRedisなどを使うことを検討すべきだと思います。
|
26
|
+
|
25
27
|
```sql
|
26
28
|
CREATE TABLE users(
|
27
29
|
`id` BIGINT UNSIGNED PRIMARY KEY,
|
8
a
answer
CHANGED
@@ -43,5 +43,5 @@
|
|
43
43
|
);
|
44
44
|
```
|
45
45
|
|
46
|
-
例えばこのような設計にすれば,後からメインアカウントとして利用するトークンを変更することも
|
46
|
+
例えばこのような設計にすれば,後からメインアカウントとして利用するトークンを変更することも非常に容易です。但し,主キーにVARCHARを使うとパフォーマンスが落ちてしまうのが難点ですね…
|
47
47
|
|
7
redis
answer
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
> API Key の記録について
|
22
22
|
|
23
|
-
最初からユーザとAPIキーが1対1で結びつかないことがわかっている場合,テーブルは分けるべきだと思います。よほど大規模なサービスでない限り,その程度の結合コストがボトルネックになることはありません。
|
23
|
+
最初からユーザとAPIキーが1対1で結びつかないことがわかっている場合,テーブルは分けるべきだと思います。よほど大規模なサービスでない限り,その程度の結合コストがボトルネックになることはありません。それこそこの程度でボトルネックになってしまうのであれば,(綿密な設計を行った上で)ストレージとしてMySQLの代わりにRedisなどを使うことを検討すべきだと思います。
|
24
24
|
|
25
25
|
```sql
|
26
26
|
CREATE TABLE users(
|
6
NOT NULL
answer
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
CREATE TABLE credentials(
|
34
34
|
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
35
35
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
36
|
-
`access_token` VARCHAR(60) UNIQUE,
|
36
|
+
`access_token` VARCHAR(60) UNIQUE NOT NULL,
|
37
37
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
38
38
|
`screen_name` VARCHAR(20) UNIQUE NOT NULL,
|
39
39
|
`name` VARCHAR(25) NOT NULL,
|
5
追記
answer
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
CREATE TABLE credentials(
|
34
34
|
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
35
35
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
36
|
-
`access_token` VARCHAR(60)
|
36
|
+
`access_token` VARCHAR(60) UNIQUE,
|
37
37
|
`access_token_secret` VARCHAR(60) NOT NULL,
|
38
38
|
`screen_name` VARCHAR(20) UNIQUE NOT NULL,
|
39
39
|
`name` VARCHAR(25) NOT NULL,
|
@@ -43,5 +43,5 @@
|
|
43
43
|
);
|
44
44
|
```
|
45
45
|
|
46
|
-
主キーにVARCHARを使うとパフォーマンスが落ちてしまうのが難点ですね…
|
46
|
+
例えばこのような設計にすれば,後からメインアカウントとして利用するトークンを変更することも可能です。但し,主キーにVARCHARを使うとパフォーマンスが落ちてしまうのが難点ですね…
|
47
47
|
|
4
credentials
answer
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
`updated_at` DATETIME NOT NULL
|
31
31
|
);
|
32
32
|
|
33
|
-
CREATE TABLE
|
33
|
+
CREATE TABLE credentials(
|
34
34
|
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
35
35
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
36
36
|
`access_token` VARCHAR(60) PRIMARY KEY,
|
3
変更
answer
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
`description` VARCHAR(180) NOT NULL,
|
16
16
|
`created_at` DATETIME NOT NULL,
|
17
17
|
`updated_at` DATETIME NOT NULL
|
18
|
-
)
|
18
|
+
);
|
19
19
|
```
|
20
20
|
|
21
21
|
> API Key の記録について
|
@@ -28,9 +28,9 @@
|
|
28
28
|
`main_access_token_id` NOT NULL,
|
29
29
|
`created_at` DATETIME NOT NULL,
|
30
30
|
`updated_at` DATETIME NOT NULL
|
31
|
-
)
|
31
|
+
);
|
32
32
|
|
33
|
-
CREATE TABLE
|
33
|
+
CREATE TABLE accounts(
|
34
34
|
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
35
35
|
`user_id` BIGINT UNSIGNED NOT NULL,
|
36
36
|
`access_token` VARCHAR(60) PRIMARY KEY,
|
@@ -40,7 +40,7 @@
|
|
40
40
|
`description` VARCHAR(180) NOT NULL,
|
41
41
|
`created_at` DATETIME NOT NULL,
|
42
42
|
`updated_at` DATETIME NOT NULL
|
43
|
-
)
|
43
|
+
);
|
44
44
|
```
|
45
45
|
|
46
46
|
主キーにVARCHARを使うとパフォーマンスが落ちてしまうのが難点ですね…
|
2
追記
answer
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
> 内部IDの記録について
|
2
|
+
|
1
3
|
特に頭についている数字を意識したことは無かったんですが,あれユーザIDだったんですね…
|
2
4
|
但し,この事実を前提として運用する必要は無いと思います。
|
3
5
|
|
4
|
-
アクセストークンを使いたいときいちいち結合するの面倒じゃないですか?サイズも大したことないし,両方格納しておくのが正解に思えます
|
6
|
+
(アクセストークンを使いたいときいちいち結合するの面倒じゃないですか?サイズも大したことないし,両方格納しておくのが正解に思えます)
|
5
7
|
|
6
8
|
```sql
|
7
9
|
CREATE TABLE users(
|
@@ -14,4 +16,32 @@
|
|
14
16
|
`created_at` DATETIME NOT NULL,
|
15
17
|
`updated_at` DATETIME NOT NULL
|
16
18
|
)
|
17
|
-
```
|
19
|
+
```
|
20
|
+
|
21
|
+
> API Key の記録について
|
22
|
+
|
23
|
+
最初からユーザとAPIキーが1対1で結びつかないことがわかっている場合,テーブルは分けるべきだと思います。よほど大規模なサービスでない限り,その程度の結合コストがボトルネックになることはありません。
|
24
|
+
|
25
|
+
```sql
|
26
|
+
CREATE TABLE users(
|
27
|
+
`id` BIGINT UNSIGNED PRIMARY KEY,
|
28
|
+
`main_access_token_id` NOT NULL,
|
29
|
+
`created_at` DATETIME NOT NULL,
|
30
|
+
`updated_at` DATETIME NOT NULL
|
31
|
+
)
|
32
|
+
|
33
|
+
CREATE TABLE tokens(
|
34
|
+
`id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
35
|
+
`user_id` BIGINT UNSIGNED NOT NULL,
|
36
|
+
`access_token` VARCHAR(60) PRIMARY KEY,
|
37
|
+
`access_token_secret` VARCHAR(60) NOT NULL,
|
38
|
+
`screen_name` VARCHAR(20) UNIQUE NOT NULL,
|
39
|
+
`name` VARCHAR(25) NOT NULL,
|
40
|
+
`description` VARCHAR(180) NOT NULL,
|
41
|
+
`created_at` DATETIME NOT NULL,
|
42
|
+
`updated_at` DATETIME NOT NULL
|
43
|
+
)
|
44
|
+
```
|
45
|
+
|
46
|
+
主キーにVARCHARを使うとパフォーマンスが落ちてしまうのが難点ですね…
|
47
|
+
|
1
理由
answer
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
特に頭についている数字を意識したことは無かったんですが,あれユーザIDだったんですね…
|
2
2
|
但し,この事実を前提として運用する必要は無いと思います。
|
3
3
|
|
4
|
+
アクセストークンを使いたいときいちいち結合するの面倒じゃないですか?サイズも大したことないし,両方格納しておくのが正解に思えます。
|
5
|
+
|
4
6
|
```sql
|
5
7
|
CREATE TABLE users(
|
6
8
|
`id` BIGINT UNSIGNED PRIMARY KEY,
|