Mysql 描述此实体拥有列表中哪些项的列
我正在创建一个mysql数据库,我有一个表Mysql 描述此实体拥有列表中哪些项的列,mysql,Mysql,我正在创建一个mysql数据库,我有一个表user,其中有一个名为成就的字段,我想在其中设置该用户解锁的成就 它类似于一个数组,其中size=成就数和'true'位于用户拥有此成就的位置。我想在mysql中不可能这样做,那么您有什么建议?我可能会使用3个表来实现这一点,其中1个是连接表: +--------+ +---------------+ +------------------+ | User | | Achievement | | User_Achieve
user
,其中有一个名为成就
的字段,我想在其中设置该用户解锁的成就
它类似于一个数组,其中
size=成就数
和'true'
位于用户拥有此成就的位置。我想在mysql中不可能这样做,那么您有什么建议?我可能会使用3个表来实现这一点,其中1个是连接表:
+--------+ +---------------+ +------------------+
| User | | Achievement | | User_Achievement |
+--------+ +---------------+ +------------------+
| UserID | | AchievementID | | UserID |
+--------+ +---------------+ | AchievementID |
+------------------+
因此,在本例中,Alice有两项成就,Bob有3项,Carol有0项。如果您将此列仅用于在应用程序(如网页)中显示,则可以将数据存储为字符串,然后将其转换为所需的显示,甚至直接转换为数组(例如在PHP中): 但是,如果您打算在关系数据模型中使用此数据作为信息(例如,搜索具有选项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);
这样,您就有了一个理想的模型来查询所有用户的成就,或者进行聚合(总和、计数、平均值等)
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');
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);