Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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


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

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

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

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

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

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

Ответ 2

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

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

Разумеется, "вы не должны использовать базы данных, если у вас много данных", это не лучший совет. Объем данных больше зависит от того, какую базу данных вы можете использовать, если вы ее используете. SQLite, например, не подходит для чего-то размером Stackoverflow, но MySQL или Postgres почти наверняка будут переполнены для чего-то с пятью пользователями.