我有一個數據庫,通過他們在遊戲中的嘗試來跟蹤玩家。爲了實現這個目標,我保留一張用戶表並將這些嘗試存儲在一個單獨的表中。這些表的模式是:使用「或者」類型字段創建數據庫表
CREATE TABLE users (
id BIGINT PRIMARY KEY, -- the local unique ID for this user
name TEXT UNIQUE, -- a self-chosen username for the user
first_name TEXT, -- the user's first name
last_name TEXT, -- the user's last name
email TEXT, -- the user's email address
phone TEXT -- the user's phone number
);
CREATE TABLE trials (
timestamp TIMESTAMP PRIMARY KEY, -- the time the trial took place
userid BIGINT, -- the ID of the user who completed the trial
score NUMERIC, -- the score for the trial
level NUMERIC, -- the difficulty level the trial ran at
penalties NUMERIC -- the number of penalties accrued in the trial
);
現在我需要能夠存儲來自「瞬態」用戶的嘗試。這些嘗試不應該鏈接回現有的用戶。但是,這些臨時用戶仍然可以輸入顯示在結果中的名稱。該名稱並不要求在表中是唯一的,因爲它不代表「真實」用戶。
我的第一個想法是在名爲name
的trials
表中創建一個新字段。如果userid
爲空,我會知道它是一個臨時用戶,但我仍然可以在結果中顯示name
字段。這種方法並不完全正確,它似乎會讓我的查詢更加複雜一些。另外,從某種意義上來說,我似乎在複製數據。
另一個想法是將userid
替換爲useref
文本字段,該文本字段可以是表示用戶的某種格式化字符串。例如,如果該值用大括號括起來,我會知道它是一個ID,即{58199204}
。如果該值未被包含,我會將其視爲一個臨時用戶。這更準確地表示了我試圖在概念上做什麼(即它是一個ID還是一個瞬態用戶字符串),但它確實會使我的查詢複雜化。
我使用SQLite作爲後端...它缺少一些SQL Server或MySQL的擴展功能。
對這些問題或其他解決方法有何看法?
我同意你的意見。我看不出有什麼理由爲什麼你不能有一個基本的(不完整的)用戶(有點像即時註冊)。如果規範化規則需要應用,則關閉不需要的項目(第一個/最後一個等)。我不知道類型是否真的有必要,這些短暫的用戶有賬號,但不是完整的賬號。 – 2009-11-04 07:59:50
選項2也將遵循大多數系統使用的「未驗證」帳戶的模型。 – Myles 2009-11-04 18:15:03