3

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

但是,我以前从未真正使用过数据库,所以我想知道您是否对如何设置有任何建议?

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

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

4

5 回答 5

3

1)几乎没有任何理由在不同的数据库中拥有相同应用程序的数据。除非您是财富 500 强规模的公司(好吧,我在夸大其词)。

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

举个例子:

  • T1:房间

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

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

  • T4:房间-房间连接

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

好的讨论在这里

3) 实现方面,尝试编写可重用的东西,例如具有通用的“Get_room”方法,在底层访问 DB -= 理想情况下是通过事务 SQL 或 ANSI SQL,这样您就可以相当轻松地更改 DB 后端。

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

以后,要么是 MySQL 要么是 Postgres(我不专业地做任何一个,所以不能推荐一个)。IIRC 在某些时候 Sybase 也有免费的个人数据库服务器,但不知道是否仍然如此。

于 2009-10-09T19:11:44.923 回答
3
  • 这种技术被称为实体-属性-价值模型。通常最好使用反映对象结构的数据库模式,并在对象结构发生变化时更新模式。这种严格的模式更容易查询,也更容易确保数据在数据库级别上是正确的。
  • 一个具有多个表的数据库是一种方法。
  • 如果你想要一个数据库服务器,我推荐 PostgreSQL。MySQL 有一些优点,例如易于复制,但 PostgreSQL 通常更易于使用。如果你想要一些更小的直接与应用程序一起工作的东西,SQLite 是一个很好的嵌入式数据库。
于 2009-10-09T19:14:49.490 回答
2

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

于 2009-10-09T19:32:06.817 回答
1

似乎这更像是数据库的工作

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

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

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

我正在考虑为每个实体在数据库中存储一个 Dictionary 对象。以 htis 的方式,我可以简单地即时向数据库添加新属性,而无需更改数据库的列。这听起来合理吗?

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

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

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

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

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

于 2009-10-12T12:46:48.377 回答
0

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

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

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

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

于 2009-10-09T19:23:51.683 回答