カスタムテーブル
Speakeasy 独自の拡張テーブルです。better-auth の user.email / user.phoneNumber はシステム内部用のユニーク値であるため、ユーザーが実際に入力した連絡先情報をこれらのテーブルで管理します。
outerMail
Section titled “outerMail”ユーザーの実際のメールアドレスを保持するテーブルです。1ユーザーが複数のメールアドレスを登録できます。
| カラム | 型 | NULL | デフォルト | 説明 |
|---|---|---|---|---|
id | text | NO | crypto.randomUUID() | 主キー |
userId | text | NO | — | ユーザー ID |
email | text | NO | — | メールアドレス |
primary | boolean | NO | false | プライマリメールフラグ |
verified | boolean | NO | false | 確認済みフラグ |
createdAt | timestamptz(3) | NO | NOW() | 作成日時 |
updatedAt | timestamptz(3) | NO | NOW() | 更新日時 |
インデックス
Section titled “インデックス”| 名前 | カラム | 種別 |
|---|---|---|
outerMail_userId_idx | userId | INDEX |
outerMail_email_idx | INDEX |
better-auth は user.email をユニーク制約で管理しますが、Speakeasy では以下の理由でメールアドレスを分離しています:
- 同一メールアドレスで複数ユーザーを作成する可能性(匿名→実名への移行)
user.emailにはXXXX.plfumg.com形式の内部用ユニークメールを格納- ユーザーが入力した実際のメールアドレスは
outerMailで管理
outerPhone
Section titled “outerPhone”ユーザーの実際の電話番号を保持するテーブルです。1ユーザーが複数の電話番号を登録できます。
| カラム | 型 | NULL | デフォルト | 説明 |
|---|---|---|---|---|
id | text | NO | crypto.randomUUID() | 主キー |
userId | text | NO | — | ユーザー ID |
phoneNumber | text | NO | — | 電話番号 |
primary | boolean | NO | false | プライマリ電話番号フラグ |
verified | boolean | NO | false | 確認済みフラグ |
createdAt | timestamptz(3) | NO | NOW() | 作成日時 |
updatedAt | timestamptz(3) | NO | NOW() | 更新日時 |
インデックス
Section titled “インデックス”| 名前 | カラム | 種別 |
|---|---|---|
outerPhone_userId_idx | userId | INDEX |
outerPhone_phoneNumber_idx | phoneNumber | INDEX |
outerMail と同じ設計思想で、user.phoneNumber の内部ユニーク制約とは別に、ユーザーの実際の電話番号を管理します。