我正在为游戏制作一个小插件,它需要存储有关玩家的信息:
- 用户名
- IP地址
- 游戏中的位置
- 来自该 IP 的备用用户名或来自该用户名的备用 IP 地址的列表
前段时间看了一篇文章,说除非我存储大量无法保存在ram中的信息,否则我不应该使用数据库。所以我尝试在 python 中使用 shelve 模块,但我不确定这是否是个好主意。
你们认为什么时候使用数据库是一个好主意,什么时候以另一种方式存储信息更好,除了数据库和平面文件数据库之外,还有哪些其他方式来存储信息。
最重要的是,除非您特别需要性能或高可靠性,否则请尽一切可能使您的代码最简单/最容易编写。
如果您的数据非常结构化(并且您知道 SQL 或愿意学习),那么使用类似的数据库sqlite3
可能是合适的。(您应该忽略关于数据库大小和 RAM 的评论:由于数据的结构,有时数据库甚至适用于非常小的数据集。)
如果数据相对简单并且您不需要数据库(通常)具有的可靠性,那么在程序运行时将其存储在一种内置数据类型中可能没问题。
如果您希望存储在磁盘上的数据是人类可读的(并且可以通过一些努力进行编辑),那么像 JSON(有内置json
模块)这样的格式很好,因为基本的 Python 对象可以毫不费力地序列化。如果数据不是那么简单,那么YAML本质上是 JSON 的扩展版本(PyYAML非常好。)。类似地,您可以使用 CSV 文件(csv
模块),尽管这不如 JSON 或 YAML 好,或者只是一种自定义文本格式(但要获得错误处理等方面的巧妙实现需要付出很多努力)。
最后,如果您的数据包含更高级的对象(例如递归字典或复杂的自定义数据类型),那么使用其中一种内置的二进制序列化技术(pickle
等shelve
)可能是合适的,但是,YAML 可以处理其中的许多事情(包括递归数据结构)。
一些一般要点:
假设“数据库”是指“关系数据库”——即使是像 SQLite 这样的嵌入式数据库,与纯文本文件相比也会有一些开销。但是,有时与滚动自己的开销相比,这种开销是值得的。
您需要问的最大问题是您是否在存储关系数据 - 规范化和 SQL 查询之类的东西是否有任何意义。如果您需要使用连接在多个表中查找数据,您当然应该使用关系数据库——这就是它们的用途。另一方面,如果您需要做的只是根据其主键查找一个表,那么您可能需要一个 CSV 文件。如果您坚持的是您在程序中使用的对象,那么 Pickle 和 shelve 很有用 - 如果您可以将相关的魔术方法添加到现有的类中并期望这一切都有意义。
当然,“除非你有大量数据,否则你不应该使用数据库”不是最好的建议——如果你正在使用一个数据库,数据量更多地取决于你可能使用的数据库。例如,SQLite 不适合 Stackoverflow 大小的东西——但是,MySQL 或 Postgres 几乎肯定对于有五个用户的东西来说是矫枉过正的。