Когда уместно использовать базу данных в Python

Я делаю небольшую надстройку для игры, и в ней нужно хранить информацию об игроке:

  • имя пользователя
  • айпи адрес
  • локация в игре
  • список альтернативных имен пользователей, которые пришли с этого IP-адреса, или альтернативных IP-адресов, которые пришли от этого имени пользователя

Некоторое время назад я прочитал статью, в которой говорилось, что если я не храню большой объем информации, которая не может храниться в оперативной памяти, мне не следует использовать базу данных. Поэтому я попытался использовать модуль полки в python, но я не уверен, что это хорошая идея.

Как вы думаете, ребята, когда лучше использовать базу данных, а когда лучше хранить информацию другим способом, а также какие есть другие способы хранения информации помимо баз данных и баз данных с плоскими файлами.


person user1155844    schedule 09.06.2012    source источник
comment
подумайте об этом: вам нужно хранить что-то, что будет постоянным?   -  person xvatar    schedule 09.06.2012
comment
Я бы сохранил его в файле конфигурации, прочитал бы его в памяти на время работы программы, а затем записал бы его обратно в файл конфигурации, если были сделаны какие-либо изменения.   -  person Joel Cornett    schedule 09.06.2012
comment
@xvatar: И если вы ответили на этот вопрос утвердительно, то следующим вопросом будет: действительно ли мне нужно что-то тяжелее текстового файла?   -  person Niklas B.    schedule 09.06.2012
comment
В дистрибутиве Python по умолчанию для вас открыто множество вариантов постоянных данных: JSON, pickle, Shelf, sqlite3, простой текстовый файл. Посмотрите на каждую и выберите.   -  person dawg    schedule 09.06.2012
comment
На этот вопрос на самом деле нельзя ответить, так как слишком много неизвестных (и любой ответ подлежит обсуждению и обсуждению). В FAQ упоминаются вопросы для обсуждения как неподходящие для SO, поскольку они предназначены для того, чтобы задать вопрос и получить окончательный ответ. Однозначного ответа здесь быть не может.   -  person Ken White    schedule 09.06.2012


Ответы (2)


Самое главное, если вам конкретно не нужна производительность или высокая надежность, делайте все, что сделает ваш код максимально простым/легким для написания.


Если ваши данные чрезвычайно структурированы (и вы знаете SQL или хотите его изучить), то использование такой базы данных, как sqlite3, может оказаться уместным. (Вы должны игнорировать комментарий о размере базы данных и оперативной памяти: бывают случаи, когда базы данных подходят даже для очень небольших наборов данных из-за того, как данные структурированы.)

Если данные относительно просты и вам не нужна надежность, которую имеет база данных (обычно), то сохранение их в одном из встроенных типов данных во время работы программы, вероятно, нормально.

Если вы хотите, чтобы данные, хранящиеся на диске, были удобочитаемыми (и редактируемыми с небольшими усилиями), то формат, подобный JSON (имеется встроенный модуль json), удобен, поскольку основные объекты Python сериализуются без каких-либо усилий. Если данные не такие простые, то YAML по сути является расширенной версией JSON (PyYAML очень хорош.). Точно так же вы можете использовать CSV-файлы (модули csv), хотя это далеко не так хорошо, как JSON или YAML, или просто пользовательский текстовый формат (но это довольно много усилий, чтобы аккуратно реализовать обработку ошибок и т. д.) .

Наконец, если ваши данные содержат более сложные объекты (например, рекурсивные словари или сложные пользовательские типы данных), то использование одного из встроенных методов двоичной сериализации (pickle, shelve и т. д.) может быть целесообразным, однако YAML может обрабатывать многие из этих вещей (включая рекурсивные структуры данных).

Некоторые общие моменты:

  • Обычные текстовые форматы хороши, так как они позволяют легко настраивать значения и легко отлаживать/тестировать.
  • Двоичные форматы хороши, так как они означают, что значения не могут быть изменены без дополнительных усилий (хотя это не означает, что их нельзя изменить), а размер файла меньше (вероятно, не имеет значения).
person huon    schedule 09.06.2012

Предполагая, что под «базой данных» вы подразумеваете «реляционную базу данных» — даже встроенные базы данных, такие как SQLite, имеют некоторые накладные расходы по сравнению с обычным текстовым файлом. Но иногда эти накладные расходы того стоят по сравнению с собственными.

Самый большой вопрос, который вам нужно задать, заключается в том, храните ли вы реляционные данные — имеют ли вообще смысл такие вещи, как нормализация и SQL-запросы. Если вам нужно искать данные в нескольких таблицах с помощью объединений, вам обязательно следует использовать реляционную базу данных — для этого они для. С другой стороны, если все, что вам нужно сделать, это выполнить поиск в одной таблице на основе ее первичного ключа, вам, вероятно, понадобится файл CSV. Pickle и shelve полезны, если то, что вы сохраняете, — это объекты, которые вы используете в своей программе, — если вы можете просто добавить соответствующие магические методы к вашим существующим классам и ожидать, что все это будет иметь смысл.

Конечно, «вы не должны использовать базы данных, если у вас нет большого количества данных» — не лучший совет — количество данных больше зависит от того, какую базу данных вы могли бы использовать, если вы ее используете. SQLite, например, не подходит для чего-то размером со Stackoverflow, но MySQL или Postgres почти наверняка будут излишними для чего-то с пятью пользователями.

person lvc    schedule 09.06.2012