資料庫結構文件
Rin 使用 SQLite 資料庫(透過 Drizzle ORM),共包含 12 張資料表。
資料表概覽
users(使用者表)
儲存使用者資訊,支援帳號密碼、OAuth、QQ、信箱等多種登入方式。
索引:
- 唯一索引
users_username_uniqueONusername
注意:
- 同一使用者可透過多種方式登入(GitHub + QQ + 信箱),
openid用於區分不同登入方式 email欄位用於電子郵件驗證碼登入,登入後 username 為完整信箱位址
密碼雜湊規則:
users.password儲存的是 SHA-256(無加鹽) 雜湊值,格式為 64 位十六進位小寫字串,服務端登入時會對輸入的密碼做同樣的雜湊計算後比對- 需要手動在 D1 資料庫中為使用者設定密碼時,必須寫入加密後的雜湊值,直接填寫明文密碼會導致該帳號無法登入
- 計算雜湊值(Linux):
- 計算雜湊值(macOS):
- 更新 D1 中的密碼:
feeds(文章/動態表)
儲存部落格文章內容。
關聯:
uid→users.id(文章屬於一個使用者)
moments(動態/朋友圈表)
儲存使用者發布的短動態。
關聯:
uid→users.id(動態屬於一個使用者)
comments(留言表)
儲存文章留言,支援訪客留言。
關聯:
feed_id→feeds.idON DELETE CASCADEuser_id→users.idON DELETE CASCADE(可為空)
注意:
- 訪客留言時
user_id為空,使用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
常見 key 範例:
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:以申請人信箱為key,儲存其進行中申請的狀態(階段、操作類型、JSON 載荷、驗證碼、截止時間等)。friend.email.lock:固定key為global,用於實作「同一時間僅允許一個申請」的並行鎖。
友連分組使用的 type='client.config' 鍵:
friend_groups:管理員自訂的分組名稱 JSON 陣列(不含預設分組)。friend_group_order:控制友連顯示順序的 JSON 陣列,空字串元素代表預設分組(「朋友們」),新建分組預設插入到它之後。
linked_accounts(第三方登入綁定表)
儲存使用者綁定的第三方登入帳號(GitHub、Gitee、QQ、WeChat 等)。
關聯:
user_id→users.idON DELETE CASCADE
注意:
- 同一使用者可綁定多個第三方帳號
- 同一第三方帳號不可綁定到多個使用者
資料表關聯圖
直接修改資料庫注意事項
- 使用 Drizzle ORM 遷移:修改表結構時,應產生 Drizzle 遷移檔而非直接執行 SQL
- 禁止 DROP/RENAME:Cloudflare D1 不支援
DROP TABLE與RENAME TABLE,遷移需使用ALTER TABLE新增欄位 - 時間戳格式:所有時間戳使用 Unix 時間戳(整數,單位為秒)
- 外鍵約束:SQLite 預設不會強制外鍵約束,應用程式層負責維護資料一致性
- 訪客留言:
comments.user_id可為空,刪除對應使用者時會層級刪除該使用者的所有留言
sqlite_sequence 表
sqlite_sequence 是 SQLite 內部系統表,不需要手動建立或修改。
作用:
- 記錄使用
AUTOINCREMENT的資料表目前的最大 ROWID - 確保
INTEGER PRIMARY KEY AUTOINCREMENT欄位的值單調遞增,避免 ROWID 重複使用 - 每次插入新資料列時,SQLite 會自動從此表讀取並更新序列值
注意:
- 這是 SQLite 自動維護的內部資料表,不應直接修改
- 如果某張資料表的序列值出現異常,可使用
UPDATE sqlite_sequence SET seq = N WHERE name = 'table_name'修復,但通常不需要這麼做