你能提供一些关于设置数据库的建议吗?

时间:2009-10-09 19:05:24

标签: database database-design data-modeling mud

我正在使用Python制作一个MUD(多用户地下城),我现在正处理我需要添加一些房间,敌人,物品等的地方。我可以硬编码所有这些,但似乎像这样更像是数据库的工作。

但是,我之前从未真正完成过任何数据库工作,所以我想知道你是否对如何设置它有任何建议?

  • 我应该以什么格式存储数据?
    • 我想在每个实体的数据库中存储一个Dictionary对象。以htis的方式,我可以在不改变数据库列的情况下随时向数据库添加新属性。这听起来合理吗?
  • 我是否应将所有信息存储在同一数据库中,但存储在不同数据库中的不同表格或不同实体(敌人和房间)中。

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

5 个答案:

答案 0 :(得分:3)

1)几乎没有理由在不同的数据库中为同一个应用程序提供数据。除非你是一家名为Fortune500的公司(好的,我正在解释)。

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

举个例子:

  • T1:客房

  • T2:房间公共房产(适用于每个房间),每间房间有一排*

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

    < / LI>
  • T4:客房连接

    拥有T2和T3很重要,因为它允许您将每个房间行的想法的效率和速度结合起来,适用于灵活性/可维护性/每行每个实体的空间节省(或对象/属性) /值作为IIRC,用花哨的术语调用)schema

Good discussion is here

3)实施明智,尝试写一些可重复使用的东西,例如拥有通用的“Get_room”方法,它们可以在下面访问DB - =理想情况下通过事务SQL或ANSI SQL,这样你就可以毫不费力地更改数据库后端。

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

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

答案 1 :(得分:3)

  • 此技术称为entity-attribute-value model。通常首选具有反映对象结构的DB模式,并在对象结构更改时更新模式。这种严格的模式更容易查询,并且更容易确保数据在数据库级别上是正确的。
  • 可以使用一个包含多个表的数据库。
  • 如果你想要一个数据库服务器,我推荐PostgreSQL。 MySQL具有一些优点,例如易于复制,但PostgreSQL通常可以更好地使用。如果你想要一些直接与应用程序一起工作的小东西,那么SQLite就是一个很好的嵌入式数据库。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

  似乎这更像是一份工作   对于数据库

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

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

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

  

我在考虑存储一个词典   每个数据库中的对象   实体。以htis的方式,我可以   只需添加新属性即可   数据库即时无需改动   数据库的列。那样做   听起来合理吗?

不幸的是 - 如果你这样做,你就浪费了99%的数据库功能,并且有效地将它用作美化数据存储。但是,如果您不需要上述数据库功能,那么如果您使用适合该作业的工具,则这是一个有效的路径。标准shelve模块非常值得为此目的而着眼。

  

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

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

  

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

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

答案 4 :(得分:0)

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

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

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

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