我正在使用Python制作一个MUD(多用户地下城),我现在正处理我需要添加一些房间,敌人,物品等的地方。我可以硬编码所有这些,但似乎像这样更像是数据库的工作。
但是,我之前从未真正完成过任何数据库工作,所以我想知道你是否对如何设置它有任何建议?
我是否应将所有信息存储在同一数据库中,但存储在不同数据库中的不同表格或不同实体(敌人和房间)中。
我知道这将是一堆蠕虫,但对于一个好的数据库有什么建议? MySQL是一个不错的选择吗?
答案 0 :(得分:3)
1)几乎没有理由在不同的数据库中为同一个应用程序提供数据。除非你是一家名为Fortune500的公司(好的,我正在解释)。
2)将信息存储在不同的表格中。
举个例子:
T1:客房
T2:房间公共房产(适用于每个房间),每间房间有一排*
T3:房间独特的属性(适用于少数房间,每个房间每个属性一行 - 这样可以轻松添加自定义属性而无需添加新列
< / LI>T4:客房连接
拥有T2和T3很重要,因为它允许您将每个房间行的想法的效率和速度结合起来,适用于灵活性/可维护性/每行每个实体的空间节省(或对象/属性) /值作为IIRC,用花哨的术语调用)schema
3)实施明智,尝试写一些可重复使用的东西,例如拥有通用的“Get_room”方法,它们可以在下面访问DB - =理想情况下通过事务SQL或ANSI SQL,这样你就可以毫不费力地更改数据库后端。
对于初始工作,您可以使用SQLite。便宜,简单和SQL兼容(所有的最佳属性)。安装几乎没有,数据库管理可以通过免费工具甚至FireFox插件IIRC(所有FireFox 3数据存储 - 历史,书签,地点等等 - 都是SQLite数据库)完成。
以后,无论是MySQL还是Postgres(我都不专业,所以不能推荐一个)。 IIRC在某些时候也有免费的个人数据库服务器,但不知道是否仍然如此。
答案 1 :(得分:3)
答案 2 :(得分:2)
将整个对象(序列化/编码)存储为数据库中的值对于查询是不利的 - 我确信您的泥中的某些查询不需要知道100%的属性,或者可以通过以下方式检索对象列表:属性值。
答案 3 :(得分:1)
似乎这更像是一份工作 对于数据库
没错,虽然'数据库'并不一定意味着'关系数据库'。大多数现有的MUD将所有数据存储在内存中,并从以纯文本数据格式保存的平面文件中读取。我不一定推荐这条路线,只是指出传统的数据库并不是必需的。如果你想进入关系路径,最新版本的Python附带sqlite,它是一个轻量级的嵌入式关系数据库,具有良好的SQL支持。
将关系数据库与代码一起使用可能很尴尬。对游戏逻辑类的任何更改都可能需要对数据库进行并行更改,并更改对读取和写入数据库的代码。因此,良好的规划将对您有所帮助,但如果没有经验,很难规划好的数据库架构。至少首先计划您的实体类,然后围绕它构建数据库模式。阅读normalizing a database并了解原则将有所帮助。
您可能想要使用“对象关系映射器”,它可以为您简化很多这样的操作。 Python中的示例包括SQLObject,SQLAlchemy和Autumn。这些为您隐藏了许多复杂性,但结果也可以隐藏一些重要的细节。我建议您直接使用数据库,直到您对它更熟悉,并考虑将来使用ORM。
我在考虑存储一个词典 每个数据库中的对象 实体。以htis的方式,我可以 只需添加新属性即可 数据库即时无需改动 数据库的列。那样做 听起来合理吗?
不幸的是 - 如果你这样做,你就浪费了99%的数据库功能,并且有效地将它用作美化数据存储。但是,如果您不需要上述数据库功能,那么如果您使用适合该作业的工具,则这是一个有效的路径。标准shelve模块非常值得为此目的而着眼。
我应该存储所有信息吗? 相同的数据库但不同 桌子或不同的实体(敌人 和房间)在不同的数据库中。
一个数据库。每个实体类型的数据库中有一个表。这是使用关系数据库(例如MySQL,SQL Server,SQLite等)时的典型方法。
我知道这将是一堆蠕虫, 但有什么建议 好的数据库? MySQL是一个不错的选择吗?
在你更熟悉SQL之前,我建议坚持使用sqlite。否则,MySQL是免费游戏数据库的合理选择,PostGreSQL也是如此。
答案 4 :(得分:0)
一个数据库。每个数据库表都应引用一个实际的数据对象。
例如,为所有物品,所有生物,所有角色类,所有宝物等创建一个表。
现在花一些时间来弄清楚对象如何相互关联,因为这会影响你的数据库结构。例如,一个角色可以有多个角色类吗?怪物可以有角色类吗?怪物可以携带物品吗?房间里有不止一个怪物吗?
看起来很迂腐,但是通过弄清楚哪些数据库对象“属于”哪个其他数据库对象,你可以早点省去很多麻烦。