使用“任一或”类型字段创建数据库表

时间:2009-11-04 06:09:42

标签: sql database-design sqlite data-modeling

我有一个数据库,通过他们在游戏中的尝试来跟踪玩家。为了实现这一点,我保留了一个用户表并将尝试存储在一个单独的表中。这些表的架构是:

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的一些扩展功能。

对这些问题或其他方法的任何想法?

4 个答案:

答案 0 :(得分:4)

如果没有关于瞬态用户可以使用但系统中不存在的原因的更多信息,我同意您的想法:

  1. NAME列添加到TRIALS表格
  2. 使USER_ID表中的TRIALS列为可空/可选,以指示暂时的用户状态
  3. 如果您允许瞬态用户存在于系统中,我建议:

    1. 创建USER_TYPE_CODE表格
    2. 更新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。如果不是,那就是临时用户的名字。