Что такое SQLite и каковы его основные характеристики?

Ответ

SQLite — это встраиваемая, автономная, безсерверная, транзакционная реляционная система управления базами данных (СУБД), реализованная в виде библиотеки на языке C.

Ключевые характеристики:

  • Без сервера (Serverless): SQLite не использует клиент-серверную модель. Библиотека напрямую работает с файлом БД на диске. Нет отдельного серверного процесса.
  • Встраиваемая (Embedded): Библиотека линкуется с приложением, становясь его частью. Это делает развертывание простым.
  • Один файл: Вся база данных (таблицы, индексы, данные) хранится в одном кроссплатформенном файле на диске.
  • Поддержка SQL: Поддерживает большую часть стандарта SQL-92, включая транзакции, представления, триггеры, внешние ключи.
  • Типизация: Использует динамическую типизацию (manifest typing). Тип значения привязан к самому значению, а не к столбцу. Столбцы могут хранить значения любого типа.

Типичные сценарии использования:

  1. Локальное хранилище для desktop/mobile приложений (браузеры, медиаплееры, мобильные ОС).
  2. Встроенная БД для IoT и устройств с ограниченными ресурсами.
  3. Формат файла для приложений (замена собственным бинарным форматам).
  4. База данных для тестирования и прототипирования благодаря простоте настройки.
  5. Кэш или промежуточное хранилище для веб-приложений.

Пример подключения в Java (через JDBC-драйвер org.xerial:sqlite-jdbc):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

// URL указывает на файл БД. Если файла нет, он будет создан.
String url = "jdbc:sqlite:/path/to/database.db";
Connection conn = DriverManager.getConnection(url);

Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
stmt.execute("INSERT INTO users (name) VALUES ('Alice')");

conn.close();

Ограничения и когда НЕ использовать SQLite:

  • Высоконагруженные веб-сайты с большим количеством параллельных записей.
  • Системы, требующие сетевого доступа к БД (нет встроенного сетевого протокола).
  • Очень большие наборы данных (хотя поддерживает терабайты, архитектура оптимизирована для меньших объемов).
  • Ситуации, требующие сложных прав доступа пользователей (нет встроенной системы пользователей).

Ответ 18+ 🔞

Ну, слушай, смотри, вот есть у нас эта SQLite, такая, понимаешь, скромная библиотечка на C. Представь себе, не надо никаких этих серверов, которые орут, как потерпевшие, и едят память, как не в себя. Всё, блядь, проще пареной репы: один файл на диске — и вся твоя база данных там, как есть. Никаких этих клиент-серверных плясок с бубном, ёпта!

Характеристики, блядь, просто огонь:

  • Без сервера (Serverless): То есть вообще нихуя отдельного процесса нет. Библиотека сама, как хитрая жопа, лезет в файл и там всё делает. Красота!
  • Встраиваемая (Embedded): Линкуешь её со своим приложением — и всё, она теперь часть твоей программы. Разворачивать — одно удовольствие, в рот меня чих-пых!
  • Один файл: Вся база — таблицы, индексы, данные — в одном-единственном файле. Перенёс его на флешку — и порядок, блядь.
  • SQL поддерживает: Да почти весь SQL-92, ей-богу! Транзакции, представления, триггеры, внешние ключи — всё на месте, не хухры-мухры.
  • Типизация: А вот тут, сука, прикол! Типизация динамическая. То есть тип привязан к значению, а не к столбцу. Можешь в один столбец запихнуть и число, и текст, и дату — и она не обосрётся. Гибко, конечно, но если ты распиздяй, то сам себя и закопаешь.

Где это добро применяют? Да везде, где не нужно овердохуища мощности:

  1. Локальное хранилище для десктопных или мобильных приложений. Тот же браузер твой в ней историю складывает.
  2. Всякие умные чайники и IoT-устройства, где ресурсов — кот наплакал.
  3. Как формат файла для своего софта вместо этих своих кривых бинарников.
  4. Для тестов и прототипов — идеально, потому что настроек ноль, а результат есть.
  5. Кэш какой-нибудь для веб-приложения.

Вот, смотри, как в Java с ней работать (драйвер org.xerial:sqlite-jdbc):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

// URL указывает на файл БД. Если файла нет, он будет создан.
String url = "jdbc:sqlite:/path/to/database.db";
Connection conn = DriverManager.getConnection(url);

Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
stmt.execute("INSERT INTO users (name) VALUES ('Alice')");

conn.close();

Видишь? Никакого геморроя. Подключился к файлу как к базе — и поехали.

А теперь, блядь, главное — когда её НЕ НАДО использовать, а то некоторые, как обезьяны с гранатой:

  • Высоконагруженные веб-сайты, где тысячи запросов в секунду на запись. Она, бедная, захлебнётся, файл будет в lock'е вечно.
  • Если нужен сетевой доступ к базе из кучи мест. Нет у неё встроенного сетевого протокола, ёпта! Это ж не PostgreSQL.
  • Очень-очень большие данные, терабайты какие-нибудь. Хотя теоретически может, но архитектура-то для скромных объёмов заточена.
  • Когда нужна сложная система прав доступа для разных пользователей. Тут тебе не банк, блядь, тут один файл — и все им владеют.

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