我正在用 Python 开发 MUD(多用户地下城),现在我需要添加一些房间、敌人、物品等。我可以对所有这些进行硬编码,但这似乎更像是数据库的工作。

但是,我以前从未真正做过任何数据库工作,所以我想知道您对如何设置它有什么建议吗?

  • 我应该以什么格式存储数据?
    • 我正在考虑在数据库中为每个实体存储一个 Dictionary 对象。通过这种方式,我可以简单地动态向数据库添加新属性,而无需更改数据库的列。听起来合理吗?
  • 我应该将所有信息存储在同一个数据库中,但存储在不同的表中或不同数据库中的不同实体(敌人和房间)中。

  • 我知道这会是一大堆蠕虫,但是对于一个好的数据库有什么建议呢?MySQL 是一个好的选择吗?

有帮助吗?

解决方案

1) 几乎没有任何理由将同一应用程序的数据存储在不同的数据库中。除非您是财富 500 强规模的公司(好吧,我有点夸张)。

2)将信息存储在不同的表中。

举个例子:

  • T1:客房

  • T2:房间公共属性(适用于每个房间),每个**房间*一行

  • T3:房间独特属性(适用于少数房间,每排一排) 每间房的财产 - 这样可以轻松添加自定义属性,而无需添加新列

  • T4:房间与房间的连接

    拥有 T2 和 T3 很重要,因为它允许您将每房间行理念的效率和速度结合起来,适用于每行属性的灵活性/可维护性/空间节省(或对象/属性/值作为IIRC 它被称为奇特的术语)模式

好的讨论就在这里

3)在实现方面,尝试编写可重用的东西,例如具有通用的“Get_room”方法,该方法在底层访问数据库 - = 最好通过事务 SQL 或 ANSI SQL,这样您就可以轻松地应对数据库后端的更改。

对于初始工作,您可以使用 SQLite。便宜、简单且兼容 SQL(所有属性中最好的)。安装几乎没什么,数据库管理可以通过免费软件工具甚至 FireFox 插件 IIRC(所有 FireFox 3 数据存储 - 历史记录、书签、位置等......- 都是 SQLite 数据库)。

对于后来的情况,可以选择 MySQL 或 Postgres(我不专业地做任何一种,所以不能推荐其中之一)。IIRC 在某个时候 Sybase 也有免费的个人数据库服务器,但不知道情况是否仍然如此。

其他提示

  • 这种技术称为 实体-属性-值模型. 。通常首选具有反映对象结构的数据库架构,并在对象结构发生更改时更新架构。这种严格的模式更容易查询,并且更容易确保数据在数据库级别上是正确的。
  • 一个数据库有多个表就是一种方法。
  • 如果您需要数据库服务器,我推荐 PostgreSQL。MySQL 有一些优点,例如易于复制,但 PostgreSQL 通常更易于使用。如果您想要一些可以直接与应用程序一起使用的较小的数据库,SQLite 是一个很好的嵌入式数据库。

将整个对象(序列化/编码)作为值存储在数据库中不利于查询 - 我确信您的 mud 中的某些查询不需要知道 100% 的属性,或者可以通过值检索对象列表属性。

似乎这是数据库的工作

确实如此,尽管“数据库”不一定意味着“关系数据库”。大多数现有的 MUD 将所有数据存储在内存中,并从以纯文本数据格式保存的平面文件中读取数据。我不一定推荐这条路线,只是指出传统数据库根本没有必要。如果您确实想走关系路线,最新版本的 Python 附带了 sqlite 这是一个轻量级的嵌入式关系数据库,具有良好的 SQL 支持。

在代码中使用关系数据库可能会很尴尬。对游戏逻辑类的任何更改都可能需要对数据库进行并行更改,以及对读取和写入数据库的代码进行更改。因此,良好的规划会对您有很大帮助,但如果没有经验,很难规划出良好的数据库模式。至少首先规划您的实体类,然后围绕它构建数据库模式。继续阅读 规范化数据库 理解那里的原则会有帮助。

您可能想要使用“对象关系映射器”,它可以为您简化很多工作。Python 中的示例包括 SQL对象, SQL炼金术, , 和 秋天. 。这些为您隐藏了很多复杂性,但因此也隐藏了一些重要的细节。我建议您直接使用数据库,直到您更熟悉它,并考虑将来使用 ORM。

我正在考虑为每个实体的数据库中存储一个字典对象。然后,以HTIS的方式,我可以随时在数据库中添加新属性,而无需更改数据库的列。这听起来合理吗?

不幸的是不是 - 如果你这样做,你就浪费了数据库 99% 的功能,并且有效地将其用作美化的数据存储。但是,如果您不需要上述数据库功能,并且使用正确的工具来完成这项工作,那么这是一条有效的途径。标准 搁置 为此目的,模块非常值得一看。

我应该将所有信息存储在同一数据库中,而将其存储在不同数据库中的不同表或不同的实体(敌人和房间)中。

一个数据库。每个实体类型在数据库中都有一个表。这是使用关系数据库时的典型方法(例如MySQL、SQL Server、SQLite 等)。

我知道这将是一罐蠕虫,但是对于一个好的数据库有什么建议?MySQL 是一个好的选择吗?

我建议坚持使用 sqlite,直到您更熟悉 SQL。除此之外,MySQL 是免费游戏数据库的合理选择,PostGreSQL 也是如此。

一个数据库。每个数据库表应该引用一个实际的数据对象。

例如,为所有物品、所有生物、所有角色类别、所有宝藏等创建一个表。

现在花一些时间弄清楚对象如何相互关联,因为这将影响您的数据库结构。例如,一个角色可以有多个角色类别吗?怪物可以有角色类别吗?怪物可以携带物品吗?房间里可以有多个怪物吗?

这看起来很迂腐,但是通过弄清楚哪些数据库对象“属于”哪些其他数据库对象,您可以尽早为自己省去很多麻烦。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top