我是数据库设计的新手,在为战斗游戏设计 PostgreSQL 数据库时遇到了很多麻烦。
在这个游戏中,玩家将在他们之间进行战斗,获得资源来购买更好的武器和盔甲。战斗将被记录以供将来审查,并且战斗的数量预计将迅速增长,例如,1k 玩家战斗 1k 回合将产生 500k 记录。
游戏交互性降低,花费积分升级战斗机装备和能力。战斗由机器解决。
细节:
- 每个战士只能拥有一次特定类型的武器或盔甲。
- 战士几乎都会被搜索
id
。 - 我经常需要搜索特定战士拥有哪些装备(武器和/或盔甲),但我不希望搜索哪些战士拥有特定类型的武器。
- 战斗通常会被
winner
或搜索loser
。 - 两个给定的
fighters
可以在不同的日期多次战斗,所以元组winner
-loser
在桌子上不是唯一的combats
fighters
表包含很多列,这些列通常会同时被检索到(我创建了两个“Fighter”类的对象,在战斗开始时包含所有相关信息)
这是我目前的设计:
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
and上使用的多列主键fighters_armors
吗? - PostgreSQL 会自动为每个主键创建索引,但我不希望通过它搜索几个表(即
combats
)。我应该删除性能索引吗?PostgreSQL 抱怨现有的约束。 - 正如我将搜索
fighters_weapons
和fighters_armors
byfighter
以及combats
bywinner
andloser
一样,您认为我应该为这些表上的所有这些列创建索引吗? - 任何性能改进建议?最常用的操作是:插入和查询战士,查询给定战士的装备和插入战斗。
非常感谢 :)