我是数据库设计的新手,我在为战斗游戏设计PostgreSQL数据库时遇到了很多麻烦。
在这个游戏中,玩家将在他们之间进行战斗,获得购买更好武器和装甲的资源。将记录战斗以供将来审查,预计战斗数量将迅速增加,例如,1k战斗1k轮的玩家将产生50万条记录。
游戏互动性降低,用于升级战斗机装备和装备。战斗由机器解决。
详细说明:
id
搜索。winner
或loser
搜索到。fighters
可以在不同日期多次竞争,因此元组winner
- loser
在表combats
上不是唯一的fighters
表包含很多列,这些列通常会同时被检索到(我在战斗开始的任何时候创建两个“战斗机”类对象及所有相关信息)这是我目前的设计:
CREATE TABLE IF NOT EXISTS weapons (
id serial PRIMARY KEY,
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS armors (
id serial PRIMARY KEY,
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS fighters (
id serial PRIMARY KEY,
preferred_weapon INT references weapons(id),
preferred_armor INT references armors(id),
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS combats (
id serial PRIMARY KEY,
winner INT references fighters(id),
loser INT references fighters(id),
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS fighters_weapons (
fighter INT NOT NULL references fighters(id),
weapon INT NOT NULL references weapons(id),
PRIMARY KEY(fighter, weapon)
);
CREATE TABLE IF NOT EXISTS fighters_armors (
fighter INT NOT NULL references fighters(id),
armor INT NOT NULL references armors(id),
PRIMARY KEY(fighter, armor)
);
我的问题是:
id
列的示例数据库作为每个表的主键。有什么理由吗?我应该这样做,而不是我在fighters_weapons
和fighters_armors
上使用的多列主键?combats
)。我应该删除性能索引吗? PostgreSQL抱怨现有的约束。fighters_weapons
搜索fighters_armors
和fighter
,以及combats
和winner
搜索loser
,您认为我是应该为这些表上的所有列创建索引吗?非常感谢:)
答案 0 :(得分:0)
解决您的明确问题:
2)最好使用“自然”值作为主键,即如果存在则不使用序列ID。如果您不太可能使用序列ID作为标识符,我会说最好不要添加它。
3)除非你打算很快地将很多行插入到战斗表中,否则在id列上输入索引可能不会太麻烦。
4)如果索引{战斗机,武器}存在,则无需在{战斗机}上创建索引,并且如果索引{战斗机,护甲}存在,则类似地在{战斗机}上创建索引是不必要的。通常,您不会受益于创建作为另一个多列索引的前缀的索引。另外,根据您描述的访问模式,在战斗中创建{winner}和{loser}索引似乎是一个好主意。
5)除了表设计之外,如果您自己安装了数据库,则可能需要设置一些数据库调整参数。如果有经验的数据库管理员已经设置了数据库,他/她可能已经为您完成了此操作。