内部IDの記録について
特に頭についている数字を意識したことは無かったんですが,あれユーザIDだったんですね…
但し,この事実を前提として運用する必要は無いと思います。
(アクセストークンを使いたいときいちいち結合するの面倒じゃないですか?サイズも大したことないし,両方格納しておくのが正解に思えます)
sql
1CREATE TABLE users(
2 `id` BIGINT UNSIGNED PRIMARY KEY,
3 `access_token` VARCHAR(60) NOT NULL UNIQUE,
4 `access_token_secret` VARCHAR(60) NOT NULL,
5 `screen_name` VARCHAR(20) NOT NULL,
6 `name` VARCHAR(25) NOT NULL,
7 `description` VARCHAR(180) NOT NULL,
8 `created_at` DATETIME NOT NULL,
9 `updated_at` DATETIME NOT NULL
10);
知らない間にscreen_nameが変更され,それが別の人のものに入れ替わっている可能性があるので,あえてUNIQUE制約は外しました。
API Key の記録について
最初からユーザとAPIキーが1対1で結びつかないことがわかっている場合,テーブルは分けるべきだと思います。よほど大規模なサービスでない限り,その程度の結合コストがボトルネックになることはありません。JOIN句を使えばクエリは1個に収まりますし。
それこそこの程度でボトルネックになってしまうのであれば,(綿密な設計を行った上で)ストレージとしてMySQLの代わりにRedisなどを使うことを検討すべきだと思います。
sql
1CREATE TABLE users(
2 `id` INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
3 `main_access_token_id` BIGINT UNSIGNED NOT NULL UNIQUE,
4 `created_at` DATETIME NOT NULL,
5 `updated_at` DATETIME NOT NULL
6);
7
8CREATE TABLE credentials(
9 `id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
10 `user_id` INTEGER UNSIGNED NOT NULL,
11 `access_token` VARCHAR(60) NOT NULL UNIQUE,
12 `access_token_secret` VARCHAR(60) NOT NULL,
13 `screen_name` VARCHAR(20) NOT NULL,
14 `name` VARCHAR(25) NOT NULL,
15 `description` VARCHAR(180) NOT NULL,
16 `created_at` DATETIME NOT NULL,
17 `updated_at` DATETIME NOT NULL
18);
例えばこのような設計にすれば,後からメインアカウントとして利用するトークンを変更することも非常に容易です。但し,主キーにVARCHARを使うとパフォーマンスが落ちてしまうのが難点ですね…
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/25 13:59