データベーススキーマドキュメント
Rin は SQLite データベース(Drizzle ORM 経由)を使用し、12 のテーブルを持ちます。
テーブル概要
users(ユーザーテーブル)
ユーザー情報を保存し、複数のログイン方法をサポートします。
インデックス:
- 一意インデックス
users_username_uniqueONusername
注記:
- 同じユーザーが複数の方法(GitHub + QQ + メール)でログイン可能。
openidが異なるログイン方法を区別します emailフィールドはメール認証ログインに使用され、ログイン後のユーザー名は完全なメールアドレスになります
パスワードハッシュのルール:
users.passwordは ソルトなし SHA-256 ハッシュを 64 文字の小文字 16 進数文字列として保存します。ログイン時にサーバーは送信されたパスワードを同じ方法でハッシュ化し、結果を比較します- D1 データベースで手動でパスワードを設定する場合は、ハッシュ値をカラムに書き込んでください。平文パスワードではアカウントにログインできなくなります
- Linux でハッシュを計算:
- macOS でハッシュを計算:
- D1 でパスワードを更新:
feeds(投稿テーブル)
ブログ記事の内容を保存します。
リレーション:
uid→users.id(投稿は 1 人のユーザーに属する)
moments(モーメントテーブル)
ユーザーの短い投稿/モーメントを保存します。
リレーション:
uid→users.id(モーメントは 1 人のユーザーに属する)
comments(コメントテーブル)
投稿へのコメントを保存し、ゲストコメントをサポートします。
リレーション:
feed_id→feeds.idON DELETE CASCADEuser_id→users.idON DELETE CASCADE(nullable)
注記:
- ゲストコメントの場合、
user_idは NULL で、ゲスト情報にはguest_name/guest_email/guest_websiteを使用します
visits(訪問記録テーブル)
投稿への各訪問を記録します。
リレーション:
feed_id→feeds.idON DELETE CASCADE
注記:
- このテーブルは生の訪問データを保存し、統計は
visit_stats経由で集計されます
visit_stats(訪問統計テーブル)
HyperLogLog を使用して重複排除した投稿の訪問統計を保存します。
リレーション:
feed_id→feeds.idON DELETE CASCADE
friends(友だちリンクテーブル)
友だちリンクを保存します。
リレーション:
uid→users.idON DELETE CASCADE
hashtags(タグテーブル)
投稿タグを保存します。
feed_hashtags(投稿-タグ関連テーブル)
投稿とタグの多対多関係。
リレーション:
feed_id→feeds.idON DELETE CASCADEhashtag_id→hashtags.idON DELETE CASCADE
注記:
- 複合主キーは
(feed_id, hashtag_id)で、投稿ごとのタグ割り当ての重複を防ぎます
info(システム設定テーブル)
システムのキー・バリュー設定を保存します。
インデックス:
- 一意インデックス
info_key_uniqueONkey
一般的なキーの例:
site.name- サイト名site.description- サイト説明site.avatar- サイトアバターsite.page_size- ページネーションサイズrss- RSS 有効状態- その他のランタイム設定
cache(キャッシュテーブル)
アプリケーションのキャッシュデータを保存します。
制約:
- 複合一意制約
cache_key_type_uniqueON (key,type)
インデックス:
idx_cache_typeONtypeidx_cache_keyONkey
メール友だちリンク申請で使用される type 値:
friend.email:申請者のメールをキーとし、進行中の申請状態(ステージ、操作、JSON ペイロード、検証コード、期限)を保存します。friend.email.lock:固定keyのglobalで、「同時に 1 つの申請のみ」という並行ロックを実装します。
友だちグループで使用される type='client.config' キー:
friend_groups:管理者定義のグループ名の JSON 配列(デフォルトグループを除く)。friend_group_order:友だちリンクの表示順を制御する JSON 配列。空文字列の要素はデフォルトグループ(「友だち」)を表し、新しいグループはデフォルトでその後に追加されます。
linked_accounts(サードパーティログイン連携テーブル)
ユーザーにバインドされたサードパーティログインアカウント(GitHub、Gitee、QQ、WeChat など)を保存します。
リレーション:
user_id→users.idON DELETE CASCADE
注記:
- 1 人のユーザーが複数のサードパーティアカウントをバインドできます
- 1 つのサードパーティアカウントを複数のユーザーにバインドすることはできません
テーブル関係図
データベース直接変更に関する注意
- Drizzle ORM マイグレーションを使用する:スキーマを変更する場合は、生の SQL を実行するのではなく、Drizzle マイグレーションファイルを生成してください
- DROP/RENAME 禁止:Cloudflare D1 は
DROP TABLEとRENAME TABLEをサポートしていないため、マイグレーションはALTER TABLE ADD COLUMNを使用する必要があります - タイムスタンプ形式:すべてのタイムスタンプは Unix タイムスタンプ(整数、秒)を使用します
- 外部キー制約:SQLite はデフォルトで外部キー制約を強制しないため、アプリケーション層がデータ整合性に責任を持ちます
- ゲストコメント:
comments.user_idは NULL にすることができ、ユーザーが削除されるとそのユーザーのすべてのコメントが CASCADE 削除されます
sqlite_sequence テーブル
sqlite_sequence は SQLite の内部システムテーブルです。SQLite によって自動的に作成・維持されます。
目的:
AUTOINCREMENTを使用するテーブルの現在の最大 ROWID を記録しますINTEGER PRIMARY KEY AUTOINCREMENTカラムが単調増加し、ROWID の再利用を防ぐことを保証します- SQLite は新しい行が挿入されるたびに、このテーブルからシーケンス値を自動的に読み取り・更新します
注記:
- これは SQLite が維持する内部テーブルであり、直接変更すべきではありません
- テーブルのシーケンス値が破損した場合は、
UPDATE sqlite_sequence SET seq = N WHERE name = 'table_name'で修正できますが、これはほとんど必要ありません