2009-11-04 74 views
2

我有一個數據庫,通過他們在遊戲中的嘗試來跟蹤玩家。爲了實現這個目標,我保留一張用戶表並將這些嘗試存儲在一個單獨的表中。這些表的模式是:使用「或者」類型字段創建數據庫表

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 
); 

現在我需要能夠存儲來自「瞬態」用戶的嘗試。這些嘗試不應該鏈接回現有的用戶。但是,這些臨時用戶仍然可以輸入顯示在結果中的名稱。該名稱並不要求在表中是唯一的,因爲它不代表「真實」用戶。

我的第一個想法是在名爲nametrials表中創建一個新字段。如果userid爲空,我會知道它是一個臨時用戶,但我仍然可以在結果中顯示name字段。這種方法並不完全正確,它似乎會讓我的查詢更加複雜一些。另外,從某種意義上來說,我似乎在複製數據。

另一個想法是將userid替換爲useref文本字段,該文本字段可以是表示用戶的某種格式化字符串。例如,如果該值用大括號括起來,我會知道它是一個ID,即{58199204}。如果該值未被包含,我會將其視爲一個臨時用戶。這更準確地表示了我試圖在概念上做什麼(即它是一個ID還是一個瞬態用戶字符串),但它確實會使我的查詢複雜化。

我使用SQLite作爲後端...它缺少一些SQL Server或MySQL的擴展功能。

對這些問題或其他解決方法有何看法?

回答

4

如果沒有,爲什麼一過,用戶可以使用,但在系統中不存在更多的信息,我同意你的想法:

  1. 添加NAME列到TRIALS
  2. 充分利用USER_IDTRIALS表可以爲空或可選,以指示瞬態用戶狀態

如果您可以允許系統中存在瞬態用戶,我會建議:

  1. 創建USER_TYPE_CODE
  2. 更新USERS表包括USER_TYPE_CODE柱(W /外鍵參考USER_TYPE_CODE表)
+1

我同意你的意見。我看不出有什麼理由爲什麼你不能有一個基本的(不完整的)用戶(有點像即時註冊)。如果規範化規則需要應用,則關閉不需要的項目(第一個/最後一個等)。我不知道類型是否真的有必要,這些短暫的用戶有賬號,但不是完整的賬號。 – 2009-11-04 07:59:50

+0

選項2也將遵循大多數系統使用的「未驗證」帳戶的模型。 – Myles 2009-11-04 18:15:03

2

您可以在users表中創建一個UserType字段,並向Users表中添加「transient」用戶,但這可能會增加Users表的大小,或者在Trials表上創建一個UserType字段並創建一個額外的TransientUsers表。

這將允許您區分userid與UserType字段的區別。

+0

「創建額外的TransientUsers表」 - 這是經過驗證的測試方法,在SQL世界中稱爲「子類」。絕對要走的路。 – onedaywhen 2009-11-04 08:45:18

-1

SQLite讓你混合字段中的類型。我建議你按照你的想法去做,但沒有大括號。禁止數字名稱。如果用戶標識是一個數字,這恰好與用戶表中的某個標識相匹配,則它是一個用戶標識。如果不是,則是臨時用戶的名稱。

+0

混合數據類型是一個非常糟糕的主意...... – 2009-11-04 07:17:35

+1

只是讓事情被允許並不是一個好主意。允許的原因是保持SQLite簡單,而不是讓你的生活更難。 – 2009-11-04 08:01:20

1

我想指出的是,你真的不該不使用格式化的字符串方法。如果用戶在您的數據庫中發現一個竊聽輸入端口並輸入「{8437101}」(或他們想要的任何用戶ID),會發生什麼?

+0

是的,我也在質疑。雖然它符合問題的心理模型,但看起來很麻煩。 – jheddings 2009-11-04 15:02:24

相關問題