Лучший способ связать фотографии с приложением: файлы или в базе данных sqlite? - PullRequest
4 голосов
/ 07 июня 2010

Допустим, у меня есть приложение, которое позволяет вам просматривать список автомобилей, найденных в базе данных Sqlite. Если щелкнуть автомобиль в списке, откроется окно с описанием автомобиля и фотографией автомобиля.

У меня такой вопрос: я должен хранить фотографию в базе данных в виде столбца двоичных данных в строке для этой конкретной машины, или я должен иметь фотографию где-нибудь в каталоге ресурсов? Что лучше сделать? Есть ли какие-либо ограничения Sqlite с точки зрения размера столбца двоичных данных?

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

Ответы [ 2 ]

4 голосов
/ 07 июня 2010

Это решение, которое обсуждается довольно часто.И на мой взгляд, это вопрос личного вкуса.Очень похоже на дебаты в vim / emacs, windows / linux.Не то чтобы с подогревом, хотя.

Обе стороны имеют свои преимущества и недостатки.Когда вы храните их в базе данных, вам не нужно сильно беспокоиться об имени файла и расположении.Управление также проще (вы удаляете строки, содержащие BLOB, и все).Но к файлам также сложнее получить доступ, и вам может понадобится написать код-обертку тем или иным способом (например, некоторые из этих ссылок "download.php").

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

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

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

TX-Log и FS-Journal

При дальнейшем изучении я нашел дополнительную информацию:

  • SQLite использует журнал транзакций
  • Android использует YAFFS в точках монтирования системы и VFAT на SD-карте.Оба (насколько мне известно) не имеют квалификации.

Я не знаю точную реализацию TX-Log в SQLite, но следует ожидать, что каждый INSERT / UPDATEОперация выполнит две записи на диск.Я могу ошибаться (это во многом зависит от реализации транзакций), но, честно говоря, я не смог потрудиться просмотреть исходный код SQLite.Мне кажется, что мы начинаем расщеплять волосы здесь (преждевременная оптимизация?) ...

Поскольку обе файловые системы (YAFFS и VFAT) не регистрируются, у вас нет дополнительных «скрытых» операций записи.

Эти два пункта говорят в пользу файловой системы.

Обратите внимание, что эту информацию следует брать с крошкой соли.Я просмотрел только результаты Google YAFFS journaling и sqlite transaction log.Возможно, я пропустил некоторые детали.

0 голосов
/ 07 июня 2010

Размер MAX SQLite по умолчанию для BLOB или строки составляет 2 31 -1 байт. Это значение также относится к максимальному количеству байтов, которые должны быть сохранены в строке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...