上一章的 FSM 解出了「誰買了什麼」——但那個「誰」,其實只是 FB 給的一串數字。他可能從來沒註冊過我們的平台,可能明天才會登入,可能永遠不會。而庫存現在就要卡給他。這章講全景裡我說「全系列最容易被低估」的問題:留言的那個人,到底是誰。
一般電商的順序是:註冊 → 登入 → 下單。直播代購把它整個倒過來:下單的當下,對方可能什麼都不是——不是會員、沒裝 app、沒登入過。你只知道 FB 說有個 user id 留了 2601+1。
當年的解法,現在回看就是教科書的分層:identity 與 account 是兩回事。

這個分層的關鍵回報:訂單從頭到尾不用搬家。綁定、解綁、多綁一個身分,都只動關聯,不動單——所有跟錢和庫存有關的東西,永遠釘在它誕生時的事實上。
購物車那張表當年是這樣長的:
fb_user_id 其實查 fb_msg 就有——放進關聯表是刻意違反 3NF:msg 表太大,而全系統最熱的查詢(LWW 覆蓋要找「此人此 key 的單」)不能穿過它。這是一次教科書等級的安全反正規化,因為拷貝的是不可變的欄位——訊息的作者永遠不會變,這份拷貝永遠不會歪。正規化的實戰判準就藏在這:拷貝不可變的欄位,風險趨近零;拷貝會變的欄位,等於簽下終身同步的合約。
這章最深的一課,是承認**「人」不是一個 id**。設計者最自然的傲慢,是假設一人一帳號、帳號即本人——然後現實給你看:用家人帳號結帳的客人、一人三個 FB 的客人、永遠不註冊但月月下單的客人。當年的模型能撐住,是因為它從第一天就沒有假裝認識「人」:它只記錄「哪個身分做了什麼」,把「這些身分是不是同一個人」留給綁定去表達,而且允許答案隨時追加。謙遜的資料模型,比聰明的資料模型活得久。
不過,「把身分綁到帳號」這件事,還有一堵 FB 親手砌的牆擋在中間。明天講我們怎麼跟這堵牆共處。
本文改寫自我的部落格系列《Re:從零開始做直播代購電商平台》,本篇完整版:https://blog.aidan.tw/blog/rezero-identity/