【问题标题】:When is it appropriate to use a database , in Python什么时候适合在 Python 中使用数据库
【发布时间】:2012-06-13 01:06:21
【问题描述】:

我正在为一个游戏制作一个小插件,它需要存储玩家的信息:

  • 用户名
  • IP 地址
  • 游戏中的位置
  • 来自该 ip 的备用用户名或来自该用户名的备用 ip 地址的列表

我前段时间读过一篇文章,说除非我存储大量无法保存在ram中的信息,否则我不应该使用数据库。所以我尝试在 python 中使用 shelve 模块,但我不确定这是否是一个好主意。

你们认为什么时候使用数据库是个好主意,什么时候以另一种方式存储信息更好,除了数据库和平面文件数据库之外,还有哪些其他方式来存储信息。

【问题讨论】:

  • 想一想:你需要存储一些“持久”的东西吗?
  • 我会将其存储在配置文件中,在程序运行期间将其读入内存,然后在进行任何更改时将其写回配置文件。
  • @xvatar:如果你的回答是“是”,那么下一个问题是“我真的需要比文本文件更重的东西吗?”
  • 在 Python 的默认分发中,有许多选项可供您用于持久化数据:JSON、pickle、shelf、sqlite3、简单文本文件。查看每个并选择。
  • 这个问题无法真正回答,因为未知数太多(任何答案都取决于意见和讨论)。 FAQ 提到讨论问题不适合 SO,因为它是围绕“提出问题,获得明确答案”而设计的。这里没有一个可以给出“正确”的单一答案。

标签: python database flat-file


【解决方案1】:

最重要的是,除非您特别需要性能或高可靠性,否则请尽一切可能使您的代码最简单/最容易编写。


如果您的数据非常结构化(并且您知道 SQL 或愿意学习),那么使用像 sqlite3 这样的数据库可能是合适的。 (您应该忽略关于数据库大小和 RAM 的评论:由于数据的结构,有时数据库甚至适用于非常小的数据集。)

如果数据相对简单并且您不需要数据库(通常)具有的可靠性,那么在程序运行时将其存储在一种内置数据类型中可能没问题。

如果您希望存储在磁盘上的数据是人类可读的(并且可编辑,但需要付出一些努力),那么像 JSON 这样的格式(内置 json 模块)是不错的选择,因为基本的 Python 对象毫不费力地连载。如果数据不是那么简单,那么YAML 本质上是 JSON 的扩展版本(PyYAML 非常好。)。类似地,您可以使用 CSV 文件(csv 模块),尽管它不如 JSON 或 YAML 好,或者只是一种自定义文本格式(但这是实现错误处理等方面的大量工作)整齐)。

最后,如果您的数据包含更高级的对象(例如递归字典或复杂的自定义数据类型),则使用内置二进制序列化技术之一(pickleshelve 等)可能是合适的,但是,YAML 可以处理其中的许多事情(包括递归数据结构)。

一些一般要点:

  • 纯文本格式很好,因为它们允许轻松调整值并且调试/测试很容易
  • 二进制格式很好,因为它们意味着值不能在没有一点额外努力的情况下进行调整(但这并不是说它们不能调整),并且文件大小更小(可能不相关)

【讨论】:

    【解决方案2】:

    假设“数据库”是指“关系数据库”——即使是像 SQLite 这样的嵌入式数据库,与纯文本文件相比也会有一些开销。但是,有时与滚动自己的开销相比,这种开销是值得的。

    您需要问的最大问题是您是否存储关系数据 - 规范化和 SQL 查询之类的东西是否有意义。如果您需要使用连接在多个表中查找数据,您当然应该使用关系数据库——这就是它们的用途。另一方面,如果您需要做的只是根据主键查找 one 表,那么您可能需要一个 CSV 文件。如果你坚持的是你在程序中使用的对象,那么 Pickle 和 shelve 很有用——如果你可以将相关的魔法方法添加到现有的类中并期望这一切都有意义。

    当然,“除非您拥有大量数据,否则您不应该使用数据库”不是最好的建议 - 如果您使用的是数据库,数据量会更多地取决于您可能使用的数据库。例如,SQLite 不适合 Stackoverflow 大小的东西 - 但是,MySQL 或 Postgres 几乎肯定对于有五个用户的东西来说太过分了。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多