android - 简单 RPG 的数据库表结构

标签 android mysql database sqlite

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

到目前为止,我已经提出了一个存储玩家信息的“玩家”表。 一个“库存”表,连接到其“玩家”ID。 一个包含所有项目的“项目”表。

这是我的问题。我有一个“武器”模型,“盾牌”“胸部”“腿部”等. 对于每个元素类型的装备,每个装备可能容纳 50-100 个元素。我应该将所有项目存储在“项目”表的长列表中还是应该创建子表?比如“武器”表、“盾牌”表等并删除“元素”表?

感谢您的宝贵时间!

最佳答案

正确的答案应该是遵循公认的关系数据库设计指南,这在很大程度上取决于游戏的完整功能要求。

但是,我建议解决方案不仅是项目列表,也不仅仅是项目类型的单独表格。而是一个元素表,其中有一个“类型”列,该列引用表(武器、盔甲、收藏品等),也许还有一个类型表。

例如,武器有力量值(击中的力度)和速度值(击中的频率),但盔甲只有防御值,而收藏品有重量值。元素列表可能是一个相当复杂的事情,即在这个简单的场景中,有 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

项目表

主项目表可轻松引用所有项目。 (例如在库存中)。一个条目有它自己的唯一 ID,它引用类型(武器、盔甲......),然后是子类型表中的项目:-

  • 第一行的唯一 ID 为 1,(第一列)该项目的类型为 2(第二列)(rpg_item_types 中的 ID 2 表)(Armor),是 rpg_armour 表中 id 为 5(第 3 列)的盔甲元素( ARM 事物)。
  • 同样,第 3 项是武器(第 1 列为 1,因此输入 1),该武器在武器表中的 ID 为 2(巨剑)。

Item Table (just references to other tables)

  • 仅引用其他表,但所有项目都有唯一的 ID
  • type_reference是类型,同时 item_subtype_referenceid相应类型表中的元素(武器、盔甲、收藏品)。
  • 设置表约束,以便 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 = ? ) 会将列表限制为单个玩家。

  • 例如WHERE player_id = 2只会列出 Fredrica 的库存。

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

关于android - 简单 RPG 的数据库表结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48051507/

相关文章:

mysql - 我应该为 Spring 3.1.0、Hibernate 4.0.1.Final 和 MySQL 5.1 使用什么合并数据源?

r - 如何获取字符串格式数据的最大条数

c# - Mongodb 无法插入我的所有记录

android将工具栏标题颜色更改为白色

java - MySQL+Java webService+Android 客户端 : Is is better to make multiple queries or one big?

mysql - 在 MySQL 中操作字段的最有效方法是什么?

mysql - 产品库存数据库设计(超市)

android - 如何解决加载 Activity 的延迟问题?

java - 如何从 Java 将图标添加到 Android 中的按钮?

php - 在 SQL 或 PHP 中查询的结果操作?