-1

我正在创建一个 mysql 数据库,并且我有一个表user,其中有一个名为的字段achievements,我想在其中设置该用户解锁的成就。

它类似于一个数组,size = number of achievements其中'true'包含用户获得此成就的位置。我想在mysql中不可能这样做,所以你有什么建议?

4

2 回答 2

0

如果您只将此列用于应用程序(例如网页)中的显示,您可以将数据存储为字符串,然后将其转换为所需的显示,甚至直接转换为数组(例如在 PHP 中) :

CREATE TABLE users (userid INT, username VARCHAR(100), achievements VARCHAR(255));

INSERT INTO users (userid, username, achievements) VALUES 
(1, 'Mary', 'c1=>true,c2=>false,c3=>false,c4=>true'), 
(2, 'Sophia', 'c1=>false,c2=>true,c3=>true,c4=>true'),
(3, 'Margot', 'c1=>true,c2=>false,c3=>false,c4=>true');

但是,如果您打算将此数据用作关系数据模型中的信息(例如,搜索具有选项 c1 = true 和 c3 = false 的所有记录,或计算所有具有 c3 = true 的记录...) ,最好的选择是使用派生表,并使用数字而不是字符串:

CREATE TABLE users (userid INT, username VARCHAR(100));
CREATE TABLE options (userid INT, achievementkey CHAR(2), achievementval TINYINT);

INSERT INTO users (userid, username) VALUES 
(1, 'Mary'), 
(2, 'Sophia'),
(3, 'Margot');

INSERT INTO options (userid, achievementkey, achievementval) VALUES 
(1, 'c1', 1), 
(1, 'c2', 0), 
(1, 'c3', 1), 
(2, 'c1', 1), 
(2, 'c2', 0), 
(2, 'c3', 1), 
(3, 'c1', 0), 
(3, 'c2', 0), 
(3, 'c3', 1);

这样,您就有了一个理想的模型来查询所有用户的成就,或者进行聚合(总和、计数、平均值等)。

于 2013-08-26T18:38:05.430 回答
0

我可能会为此使用 3 个表,其中 1 个是连接表:

+--------+ +----------------+ +------------------+
| 用户 | | 成就 | | 用户_成就 |
+--------+ +----------------+ +------------------+
| 用户名 | | 成就ID | | 用户名 |
+--------+ +----------------+ | 成就ID |
                                   +------------------+

User存储所有用户,Achievement存储所有可能成就的主列表,并将它们User_Achievement 连接在一起。因此,例如,您可能有:

+----------------+ +-------------------------------- +
| 用户 | | 成就 |
+--------+-------+ +----------------+--------------- +
| 用户名 | 姓名 | | 成就ID | 姓名 |
+--------+-------+ +----------------+--------------- +
| 1 | 爱丽丝 | | 1 | 夺旗者 |
| 2 | 鲍勃 | | 2 | 爆头 |
| 3 | 卡罗尔 | | 3 | 最快时间 |
+--------+-------+ +----------------+--------------- +

       +------------------------+
       | 用户_成就 |
       +--------+---------------+
       | 用户名 | 成就ID |
       +--------+---------------+
       | 1 | 1 |
       | 1 | 3 |
       | 2 | 1 |
       | 2 | 2 |
       | 2 | 3 |
       +--------+---------------+

所以在这种情况下,Alice 有两个成就,Bob 有 3 个,Carol 有 0 个。

于 2013-08-26T18:07:37.687 回答