简单RPG的数据库表结构

时间:2018-01-01 16:52:58

标签: android mysql database sqlite

我目前正在SQLite上练习并制作一个简单的基于文本的RPG,但我需要一些表结构的建议。

到目前为止,我已经提出了一个存储播放器信息的"播放器" 表。 "广告资源" 表格,与其"播放器"相关联ID。 一个" Item" 表,其中包含所有项目。

这是我的问题。我有一个" Weapon" 模型," Shield" " Chest" " Legs" 等每个物品类型的设备,每个可容纳50-100个项目。我应该将所有项目存储在"项目" 表的长列表中,还是应该创建子表?就像一个"武器" table,a" Shield"表等并删除"项目"表

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

正确的答案应该是遵循公认的实际数据库设计指南,这些指南很大程度上取决于游戏的全部功能要求。

但是,我建议解决方案既不仅仅是项目列表,也不仅仅是项目类型的单独表格。而是一个项目表,其中包含"类型" 的列,它引用表格(武器,护甲,收藏品等)和可能类型

比方说,武器有一个力值(击中的力度)和速度值(击中的次数),但是护甲只有一个防御值,而且收藏品有一个重量值。项目列表可能是一个非常复杂的事情,即在这个简单的场景中,有4个额外的列,具有相当多的冗余,即可收集和装甲仅使用25%,而武器为50%,所以也许你可以介绍更简单的处理只使用2列。

SQLite明智的表可能是: -

CREATE TABLE IF NOT EXISTS rpg_player (_id INTEGER PRIMARY KEY, player_name TEXT);
CREATE TABLE IF NOT EXISTS rpg_item(_id INTEGER PRIMARY KEY, type_reference INTEGER, item_subtype_reference INTEGER, UNIQUE(type_reference,item_subtype_reference));
CREATE TABLE IF NOT EXISTS rpg_inventory(player_id INTEGER, item_id INTEGER, number_held INTEGER, PRIMARY KEY(player_id, item_id)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS rpg_item_types(_id INTEGER PRIMARY KEY, type_name TEXT, type_flags INTEGER);
CREATE TABLE IF NOT EXISTS rpg_weapon(weapon_id INTEGER PRIMARY KEY, weapon_name TEXT, weapon_flags INTEGER, weapon_force INTEGER, weapon_speed INTEGER);
CREATE TABLE IF NOT EXISTS rpg_armour(armour_id INTEGER PRIMARY KEY, armour_name TEXT, armour_flags INTEGER, armour_defence INTEGER);
CREATE TABLE IF NOT EXISTS rpg_collectable(collectable_id INTEGER PRIMARY KEY, collectable_name TEXT, collectable_flags INTEGER, collectable_weight INTEGER);

这些说法填充为: -

玩家表

Player Table

项目表

主项目表适用于所有容易引用的项目。 (例如在库存中)。一个条目有它自己的unqiue id引用类型(武器,护甲.....)然后是子类型表中的项目: -

  • 第一行的唯一ID为 1,(第1列),该项目的类型为 2 (第2列)( rpg_item_types中的ID为2 表格)(护甲)并且是 rpg_armour 表格中id为 5 (第3列)的护甲项目( Arm Thinggies )。
  • 同样,第3项是武器(第1列是1,因此类型1),它是2在武器表中具有id的武器(大剑)。

Item Table (just references to other tables)

  • 仅引用其他表,但所有项目都具有唯一ID
  • type_reference是类型,而item_subtype_reference是相应类型表(武器,装甲,collecatble)中项目的id
  • 设置表约束,以便type_reference和item_subtype_reference的组合必须按UNIQUE(type_reference,item_subtype_reference)
  • 唯一

库存表

Inventory Table

项目类型

此表有每个子类的条目。 Item Types Table

子项目表

为项目细节建模的表格,例如rpg_weapon有一个weapon_force和weapon_speed列,而rpg_armour只有一个armour_defence列 Weapon Table Armour Collectable

您可以使用以下内容创建项目的简单列表(输出方式): -

--LIST ALL ITEMS
SELECT 
    CASE 
        WHEN type_name = 'Weapon' THEN weapon_name || ' Type (' || type_name || ')'
        WHEN type_name = 'Armour' THEN armour_name || ' Type (' || type_name || ')'
        WHEN type_name = 'Collectable' THEN collectable_name || ' Type (' || type_name || ')'
    END AS description
    FROM rpg_item
    JOIN rpg_item_types ON type_reference = rpg_item_types._id
    LEFT JOIN rpg_weapon ON item_subtype_reference = weapon_id
    LEFT JOIN rpg_armour ON item_subtype_reference = armour_id
    LEFT JOIN rpg_collectable ON item_subtype_reference = collectable_id

导致: -

enter image description here

以下列出了所有库存项目: -

SELECT 
    CASE
        WHEN rpg_item.type_reference = 1 THEN 'Player - ' || player_name || ' has ' || weapon_name || ' it is a ' || type_name || ' it has a force of ' || weapon_force
        WHEN rpg_item_types.type_name = 'Armour' THEN  'Player - ' || player_name || ' has ' || armour_name || ' it is a ' || type_name || ' with a defence rating of ' || armour_defence
        WHEN rpg_item.type_reference = 3 THEN 'Player - ' || player_name || ' has ' || collectable_name || ' it is a ' || type_name || ' it has a weight of ' || collectable_weight
    END AS description
    FROM rpg_inventory
    JOIN rpg_player ON player_id = rpg_player._id
    JOIN rpg_item ON rpg_inventory.item_id = rpg_item._id
    JOIN rpg_item_types ON rpg_item.type_reference = rpg_item_types._id
    LEFT JOIN rpg_weapon ON rpg_item.item_subtype_reference = rpg_weapon.weapon_id
    LEFT JOIN rpg_armour ON rpg_item.item_subtype_reference = rpg_armour.armour_id
    LEFT JOIN rpg_collectable ON rpg_item.item_subtype_reference =rpg_collectable.collectable_id

基于上述结果(没有任何人持有任何武器): -

enter image description here

一个简单的WHERE子句(WHERE player_id = ?)会将列表限制为单个玩家。

  • e.g。 WHERE player_id = 2只会列出Fredrica的广告资源。

您可能希望复制并粘贴上述内容并在SQLite工具中使用它,这里有很多(我个人对SQLite Manager非常满意,其他人会推荐)其他工具,所有这些都是使用这样的工具完成的)。您可以使用这样的工具创建核心数据库访问功能的可能性非常大。