展览
假设我们的系统有用户和一些游戏。我们把这些游戏称为A、B和C。
为了简单起见,我们的初始表格如下所示:
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY
);
CREATE TABLE IF NOT EXISTS games (
id SERIAL PRIMARY KEY
);
问题
每当我们玩这些游戏并完成它们时,我们都必须记录与特定用户的游戏相关的统计数据。例如,对于游戏A,我们必须记录total_jumps和total_crouches,因为游戏的机制允许这种累积,但是游戏B和C可能要求我们记录其他total_*字段(尽管前缀total_不是必需的)。我该如何存储这些信息?
我对这个问题的解决方案感到困扰。我想出了两种方法:
解决方案 1
有一张表用于此:
CREATE TABLE IF NOT EXISTS statistics (
user_id SERIAL REFERENCES users (id) ON DELETE CASCADE,
game_id SERIAL REFERENCES games (id) ON DELETE CASCADE,
fields JSONB,
PRIMARY KEY (user_id, game_id)
);
这样,我们就可以将来自字段列的任意数据解析到应用程序级别。
解决方案 2
有多个桌子,每个游戏一个:
CREATE TABLE IF NOT EXISTS A_statistics (
user_id SERIAL PRIMARY KEY REFERENCES users (id) ON DELETE CASCADE,
total_jumps INTEGER,
total_crouches INTEGER
);
就我个人而言,解决方案 #2 看起来更好,但是...这个问题仍然困扰着我。好像我错过了什么,因为这两个选项都不能使扩展(添加新游戏)变得更容易?假设我们添加游戏D、E和F。这两种解决方案都要求我们以某种方式处理这些游戏所需的特定字段(在应用程序级别)。这是我必须接受的事情吗?或者是否有第三个更好的解决方案,我只是没有看到?