2009-10-09 29 views
3

我正在Python中使用MUD(多用户地下城),现在我只是想要添加一些房间,敌人,物品等。我可以硬编码所有这些,但它似乎是这对于数据库来说更是一份工作。你能提供一些关于设置我的数据库的建议吗?

但是,我从来没有真正做过数据库的任何工作,所以我想知道你是否有任何建议如何设置?

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

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

+0

Google搜索“泥浆数据库模式”的顶级结果是专家交流。这里希望在几天后它将成为StackOverflow! – DVK 2009-10-09 19:23:25

+1

另外,我想亲自欢迎您来到MUD开发的绝妙地狱。比我玩沉默的东西更多的乐趣,从我记得的我的不良MUD过去(我编写了一个C MUD,我的朋友跑过) – DVK 2009-10-09 19:25:51

+0

我喜欢一些MUD,但我认为开发一个会很有趣。 – samoz 2009-10-09 21:27:19

回答

3

1)在不同的数据库中,几乎没有任何理由为相同的应用程序提供数据。除非你是一家财富500强的公司(好吧,我正在扩张)。

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

作为一个例子:

  • T1:房间

  • T2:间公共属性(证明3到每个房间),每**室温行*

  • T3:房间独特的属性(适用于少数房间,每财产每间房 - thos可以很容易地添加自定义属性,无需添加新的列

  • T4:房室连接

    有T2和T3是很重要的,因为它允许你结合效率和行每个房间的想法的速度,其中它的适用与属性,每灵活性/ maintanability /节省空间-entity每行(或对象/属性/值IIRC这就是所谓的花哨术语)架构

Good discussion is here

3)实施明智,试着写一些可重复使用的,例如,具有通用的“Get_room”方法,它们在访问数据库之下 - 理想情况下通过事务SQL或ANSI SQL进行访问,这样您就可以在数据库后端更改的情况下轻松地生存。

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

以后,无论是MySQL还是Postgres(我都不是专业人士,所以不能推荐一个)。 IIRC在某些时候,Sybase也有免费的个人数据库服务器,但不知道这是否仍然如此。

3
  • 该技术被称为entity-attribute-value model。通常情况下,最好使数据库模式反映对象的结构,并在对象结构更改时更新模式。这样严格的模式更容易查询,并且更容易确保数据库级别的数据是正确的。
  • 一个具有多个表的数据库是要做的。
  • 如果你想要一个数据库服务器,我推荐PostgreSQL。 MySQL有一些优点,比如容易复制,但是PostgreSQL通常更适合使用。如果你想要更小的东西直接与应用程序一起工作,SQLite是一个很好的嵌入式数据库。
0

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

例如,创建一个表的所有项目,所有的生物,所有的角色职业,所有宝藏,等

现在花一些时间,并找出对象将如何相互关联的,因为这会影响你的数据库结构。例如,一个角色可以有多个角色类吗?怪物可以拥有角色类吗?怪物能携带物品吗?房间可以有多个怪物?

它看起来很迂腐,但通过确定哪些数据库对象“属于”其他数据库对象,您可以尽早为自己节省很多麻烦。

2

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

1

好像这更是一个工作 的一个数据库

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

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

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

我正在考虑在数据库中为每个 实体存储一个字典 对象。通过这种方式,我可以在 的数据库中简单地将新属性添加到数据库中,而不必更改数据库的列。那 听起来合理吗?

不幸的是没有 - 如果你这样做,你浪费了数据库的99%的能力,并有效地使用它作为荣耀的数据存储。但是,如果您不需要上述的数据库功能,如果您使用正确的工具进行工作,则这是一条有效的路线。标准的shelve模块非常值得为此寻找。

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

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

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

我会建议坚持使用sqlite,直到你更熟悉SQL为止。否则,MySQL是PostGreSQL的免费游戏数据库的合理选择。