所以我在数据库设置中有几张表,我想知道最好的办法是什么。
基本上我有一对多的关系,其中单个用户可以“拥有”多个项目,这由php中的数组表示,这可能会返回项目的唯一项目编号,类型和值。我如何将其存储在MySql表中?
是否最好有一个每个项目的查找表及其ID和现在的所有者?将一个行项目放在用户表中是否更有意义,该行项目具有每个玩家拥有的每个项目的csv列表(这将是索引的噩梦?)
这里有什么意义?
示例:
类字符包含项目[]
字符1在其项目列表中包含以下条目:
1,2,5,10,11,12
字符2在其项目列表中包含以下条目:
3,4,6,7,8,9,13
存储这些数据的好方法是什么?
谢谢,
答案 0 :(得分:1)
永远不要将分隔的字符串值存储在数据库中。通过创建多对多表来规范化数据。这样,您就可以正常查询数据。
据说你的架构看起来像
CREATE TABLE characters
(
char_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(32),
...
) ENGINE = InnoDB;
CREATE TABLE items
(
item_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(6),
...
) ENGINE = InnoDB;
CREATE TABLE item_list
(
char_id INT NOT NULL,
item_id INT NOT NULL,
PRIMARY KEY (char_id, item_id),
FOREIGN KEY (char_id) REFERENCES characters (char_id),
FOREIGN KEY (item_id) REFERENCES items (item_id)
) ENGINE = InnoDB;
如果您以后需要为每个字符生成一个分隔的项目列表,以便在迭代结果集时可以explode
这个值,则可以使用这样的查询
SELECT char_id, GROUP_CONCAT(item_id) items
FROM item_list
-- WHERE ...
GROUP BY char_id
这是 SQLFiddle 演示