描述此实体列表中哪些项目的列

时间:2013-08-26 17:58:13

标签: mysql

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

在用户拥有此成就的位置,它会像size = number of achievements'true'这样的数组。我想在mysql中不可能这样做,所以你有什么建议?

2 个答案:

答案 0 :(得分:0)

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

+--------+    +---------------+    +------------------+
| User   |    | Achievement   |    | User_Achievement |
+--------+    +---------------+    +------------------+
| UserID |    | AchievementID |    | UserID           |
+--------+    +---------------+    | AchievementID    |
                                   +------------------+

User存储您的所有用户,Achievement存储所有可能成就的主列表,User_Achievement 加入。所以,例如你可能有:

+----------------+    +-------------------------------+
| User           |    | Achievement                   |
+--------+-------+    +---------------+---------------+
| UserID | Name  |    | AchievementID | Name          |
+--------+-------+    +---------------+---------------+
|      1 | Alice |    |             1 | Flag Capturer |
|      2 | Bob   |    |             2 | Headshot      |
|      3 | Carol |    |             3 | Fastest Time  |
+--------+-------+    +---------------+---------------+

       +------------------------+
       | User_Achievement       |
       +--------+---------------+
       | UserID | AchievementID |
       +--------+---------------+
       |      1 |             1 |
       |      1 |             3 |
       |      2 |             1 |
       |      2 |             2 |
       |      2 |             3 |
       +--------+---------------+

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

答案 1 :(得分: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);

通过这种方式,您可以为所有用户提供成就查询的理想模型,或制作AGGREGATIONS(总和,计数,平均等等)。

相关问题