Database 为多人游戏设计存储各种需求和统计数据的表格 原始问题:

Database 为多人游戏设计存储各种需求和统计数据的表格 原始问题:,database,database-design,Database,Database Design,你好, 我正在创建一个非常简单的爱好项目-基于浏览器的多人游戏。我一直在设计表格来存储任务/技能要求的信息 目前,我以以下方式设计了我的表格: 表用户(有关用户的基本信息) 表统计数据(各种统计数据) 表用户统计数据(使用统计数据连接每个用户) 另一个例子: 表怪物(关于npc敌人的基本信息) 表怪物\u统计数据(使用上面相同的统计表将怪物与统计数据连接起来) 这些都是简单的案例。我必须承认,我在为不同的事情设计需求时遇到了困难,例如任务。示例任务A可能只有最低的角色级别要求(这很容易实

你好,

我正在创建一个非常简单的爱好项目-基于浏览器的多人游戏。我一直在设计表格来存储任务/技能要求的信息

目前,我以以下方式设计了我的表格:

  • 用户(有关用户的基本信息)
  • 统计数据(各种统计数据)
  • 用户统计数据(使用统计数据连接每个用户)
另一个例子:

  • 怪物(关于npc敌人的基本信息)
  • 怪物\u统计数据(使用上面相同的统计表将怪物与统计数据连接起来)
这些都是简单的案例。我必须承认,我在为不同的事情设计需求时遇到了困难,例如任务。示例任务A可能只有最低的角色级别要求(这很容易实现),但另一个,任务B有许多其他要求(完成任务、获得技能、拥有特定物品等)——设计存储此类信息的表格的好方法是什么

以类似的方式-存储技能要求信息的有效方式是什么?(特定字符类别、最小级别等)

如果有任何关于创建数据库驱动游戏的帮助或信息,我将不胜感激

编辑: 谢谢你的回答,但我希望得到更多。由于我在为可手工制作的物品设计一个相当复杂的数据库布局时遇到了一些问题,所以我开始对这个问题进行最大悬赏

我希望收到与设计数据库以存储游戏数据的最佳实践相关的文章/代码片段/任何内容的链接(这类信息的一个很好的例子是availibe on)


如果有任何帮助,我将不胜感激

与数据库的设计没有直接关系,但几周前有人问了一个类似的问题


我相信你可以在这里找到一些有用的东西:)

当你遇到以数据为中心的问题时,数据库就是你的朋友。到目前为止,你所做的似乎很正确

另一方面,你提到的其他问题似乎是以行为为中心的。在这种情况下,面向对象的分析和解决方案将更好地工作

例如:
创建一个带有特定任务子类的任务类。每个孩子都应该实现一个
bool-HasRequirements(Player)
方法。

我会编辑这个,尽可能多地添加其他相关问题,尽管我希望OP能够解决我上面的评论。我从几年的专业在线游戏开发者和多年的业余在线游戏开发者的经历中总结了它的价值

在线游戏意味着某种持久性,这意味着你有两种类型的数据——一种是你设计的,另一种是玩家在游戏过程中创建的。最有可能的情况是,您将在数据库中存储这两个数据。确保这些表有不同的表,并通过常用的数据库规范化规则正确地交叉引用它们。(例如,如果您的玩家制作了一把大刀,您不会创建一个包含剑的所有属性的完整新行。您可以使用每个实例属性在player_items表中创建一个新行,并参考item_types表中包含每个itemtype属性的大刀行。)如果您发现一行数据包含您设计的某些内容以及播放器在播放过程中更改的某些内容,则需要将其标准化为两个表

这确实是典型的类/实例分离问题,适用于此类游戏中的许多事情:一个地精实例不需要存储作为一个地精意味着什么的所有细节(例如绿色皮肤),只需要存储与该实例相关的东西(例如位置、当前健康状况)。有时,构造行为有一个微妙之处,即需要基于类数据创建实例数据。(例如,根据地精类型的最大运行状况设置地精实例的起始运行状况。)我的建议是将这些硬编码到创建实例的代码中,并为其插入行。这种信息很少改变,因为在实践中很少有这样的值。(初始消耗资源的分数,如生命值、耐力、法力……仅此而已。)

尝试并找到一个一致的术语来区分实例数据和类型数据-这将使以后在修补实时游戏时的生活变得更轻松,并且尝试不通过编辑错误的表来破坏玩家的辛勤工作。这也使得缓存变得更加容易——通常可以缓存类/类型数据而不受惩罚,因为只有当您(设计人员)将新数据推到上面时,数据才会发生更改。你可以运行它,或者考虑如果你的游戏有一个连续的进程(例如,不是PHP/ASP /CGI/ETC),等等。 记住,一旦上线,从设计端数据中删除任何内容都是有风险的,因为玩家生成的数据可能会引用它。在部署到live server之前,在本地彻底测试所有内容,因为一旦部署到live server上,就很难将其取下。考虑如何以安全的方式标记这些数据的行,也许是布尔的“Live”列,如果设置为false,意味着它不会出现在典型的查询中。想一想如果你禁用玩家获得的物品(如果这些物品是他们付费的,则加倍)对玩家的影响

如果不知道你想如何设计你的游戏,就无法回答实际的制作方面。数据库设计必须遵循游戏设计。但我会仔细考虑一个琐碎的想法。也许你会希望能够创建一个基本对象,然后用符文或水晶或其他东西来增强它。为此,您只需要在项实例和扩充实例之间建立一对多关系。(请记住,您可能有item类型和augmentation类型
table skill_levels
{
    int skill_id FOREIGN KEY;
    int class_id FOREIGN KEY;
    int min_level;
}

myPotentialSkillList = SELECT * FROM skill_levels INNER JOIN
    skill ON skill_levels.skill_id = skill.id
    WHERE class_id = my_skill
    ORDER BY skill_levels.min_level ASC;
<quests>
    <quest name="Return Ring to Mordor">
        <characterReqs>
            <level>60</level>
            <finishedQuests>
                <quest name="Get Double Cheeseburger" />
                <quest name="Go to Vegas for the Weekend" />
            </finishedQuests>
            <skills>
                <skill name="nunchuks" />
                <skill name="plundering" />
            </skills>
            <items>
                <item name="genie's lamp" />
                <item name="noise cancelling headphones for robin williams' voice />
            </items>
        </characterReqs>
        <steps>
            <step number="1">Get to Mordor</step>
            <step number="2">Throw Ring into Lava</step>
            <step number="3">...</step>
            <step number="4">Profit</step>
        </steps>
    </quest>
</quests>
Chars <--- CharAttributes --> AllAttributes <-- QuestPrereqs --> Quests
SELECT quest_id
FROM QuestPrereqs
 JOIN AllAttributes
 LEFT JOIN CharAttributes
GROUP BY quest_id
HAVING COUNT(AllAttributes) = COUNT(CharAttributes);
Quest
    [quest properties like name and description]
    reqItemsID
    reqSkillsID
    reqPlayerTypesID
RequiredItems
    ID
    item
RequiredSkills
    ID
    skill
RequiredPlayerTypes
    ID
    type
quest_model
===============
id
name ['Quest for the Holy Grail', 'You Killed My Father', etc.]
etc.

quest_model_req_type
===============
id
name ['Minimum Level', 'Skill', 'Equipment', etc.]
etc.

quest_model_req
===============
id
quest_id
quest_model_req_type_id
value [10 (for Minimum Level), 'Horseback Riding' (for Skill), etc.]

quest
===============
id
quest_model_id
user_id
status
etc.