我有一个数据库,通过他们在游戏中的尝试来跟踪玩家。为了实现这个目标,我保留一张用户表并将这些尝试存储在一个单独的表中。这些表的模式是:使用“或者”类型字段创建数据库表
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