我有一个数据库,通过他们在游戏中的尝试来跟踪玩家。为了实现这一点,我保留了一个用户表并将尝试存储在一个单独的表中。这些表的架构是:
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
);
现在我需要能够存储来自“瞬态”用户的尝试。不应将这些尝试链接回现有用户。但是,这些临时用户仍然可以输入显示在结果中的名称。该名称在表格中不必是唯一的,因为它不代表“真正的”用户。
我的第一个想法是在名为trials
的{{1}}表格中创建一个新字段。如果name
为空,我会知道它是一个临时用户,但我仍然可以在结果中显示userid
字段。这种方法听起来不太对劲,看起来它会使我的查询更复杂一些。此外,似乎我在某种意义上重复数据。
另一个想法是将name
替换为userid
文本字段,该字段将是表示用户的某种格式化字符串。例如,如果值用大括号括起来,我会知道它是一个ID,即useref
。如果没有包含该值,我会将其视为临时用户。这更准确地代表了我在概念上要做的事情(即它是ID或瞬态用户字符串),但它会使我的查询变得复杂。
我正在使用SQLite作为后端......它缺少SQL Server或MySQL的一些扩展功能。
对这些问题或其他方法的任何想法?
答案 0 :(得分:4)
如果没有关于瞬态用户可以使用但系统中不存在的原因的更多信息,我同意您的想法:
NAME
列添加到TRIALS
表格USER_ID
表中的TRIALS
列为可空/可选,以指示暂时的用户状态如果您允许瞬态用户存在于系统中,我建议:
USER_TYPE_CODE
表格USERS
表以包含USER_TYPE_CODE
列(带有USER_TYPE_CODE
表的外键引用)答案 1 :(得分:2)
您可以在users表中创建UserType字段,并将“transient”用户添加到Users表,但这可能会增加Users表的大小,或者在Trials表上创建UserType字段并创建一个额外的TransientUsers表。
这将允许您区分userid与UserType字段的区别。
答案 2 :(得分:1)
我想指出你真的不应该使用格式化的字符串方法。如果用户在数据库中找到错误的输入端口并输入“{8437101}”(或他们想要的任何用户ID)会发生什么?
答案 3 :(得分:-1)
SQLite允许您在字段中混合类型。我建议你像你想的那样做,但没有括号。禁止使用数字名称。如果userid是一个数字,它恰好与users表中的id匹配,那么它就是一个用户ID。如果不是,那就是临时用户的名字。