1

我是数据库设计的新手,在为战斗游戏设计 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)
);

我的问题是:

  1. 你觉得我的设计适合吗?
  2. 我已经看到很多示例数据库包含一个id列作为每个表的主键。有什么理由吗?我应该这样做而不是我在fighters_weaponsand上使用的多列主键fighters_armors吗?
  3. PostgreSQL 会自动为每个主键创建索引,但我不希望通过它搜索几个表(即combats)。我应该删除性能索引吗?PostgreSQL 抱怨现有的约束。
  4. 正如我将搜索fighters_weaponsfighters_armorsbyfighter以及combatsby winnerandloser一样,您认为我应该为这些表上的所有这些列创建索引吗?
  5. 任何性能改进建议?最常用的操作是:插入和查询战士,查询给定战士的装备和插入战斗。

非常感谢 :)

4

1 回答 1

0

要解决您的明确问题:

2) 最好使用“自然”值作为主键,即不是序列号(如果存在)。如果您不太可能使用序列号作为标识符,我会说最好不要添加它。

3) 除非您打算在战斗表中非常快速地插入许多行,否则在 id 列上有索引可能不会对您造成太大伤害。

4) 如果索引{战斗机,武器}存在,则不需要在{战斗机}上创建索引,同样,如果索引{战斗机,盔甲}存在,则不需要在{战斗机}上创建索引。通常,您不会从创建作为另一个多列索引前缀的索引中受益。另外,考虑到您描述的访问模式,在战斗中创建 {winner} 和 {loser} 索引似乎是一个好主意。

5) 除了表设计之外,如果您自己安装了数据库,您可能还需要设置一些数据库调整参数。如果有经验的数据库管理员设置了数据库,他/她可能已经为您完成了这项工作。

于 2013-02-21T00:20:34.867 回答