Короче.
Основную идею я тебе дам, но всё равно почитай уже любой учебник!
Аналогия очень простая.
Строка таблицы = структура данных, типа класса. Таблица = коллекция
однотипных структур данных.
Столбец - поле в структуре данных. Схема таблицы - описание структуры данных, т.е. набора полей.
Таким образом, изменение схемы таблицы - изменение состава структуры данных - это НЕ обычная операция.
Её не нужно использовать для добавления новых данных в коллекцию! Если ты добавляешь новые данные в коллекцию - это добавление строки, т.е. INSERT.
"А что делать, если у меня переменный набор данных? Например, есть чаты, и в них есть юзеры?"
У тебя несколько сущностей - в таких случаях тебе нужно несколько таблиц. Ключевой момент - сколько сущностей связано с той или иной сущностью.
Например, у нас есть чаты, и есть пользователи. Пользователь может быть в нескольких чатах, чат может иметь нескольких пользователей. Это называется "связь многие-ко-многим". Если сделать так, как ты делаешь сейчас, то будет таблица Чаты, и при добавлении пользователя в чат будет добавляться столбец в таблицу. Это неправильно!
Правильно: есть таблица Чаты (каждый чат имеет свой id - "ключ", "primary key"), таблица Пользователи (каждый имеет свой ключ) и вспомогательная таблица (association table) ПользовательВЧате.
В виде SQL это будет выглядить примерно так:
CREATE TABLE Chats (id INTEGER PRIMARY KEY, name TEXT, topic TEXT);
CREATE TABLE Users (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE UserInChat(
chat_id INTEGER,
user_id INTEGER,
FOREIGN KEY (chat_id) REFERENCES Chats(id),
FOREIGN KEY (user_id) REFERENCES Users(id),
PRIMARY KEY (chat_id, user_id)
);
Что это нам даёт?
- Наличие записи в UserInChat означает, что пользователь находится в чате.
- Каждая запись в UserInChat ссылает на существующего пользователя и на существующий чат.
- Сочетание пользователь-чат уникально, т.е. пользователь не может войти в один чат дважды (одновременно).
- В то же время, могут быть записи с одним и тем же пользователем (один пользователь в нескольких чатах).
- Могут быть записи с одним и тем же чатом (много пользователей в одном чате).
Как узнать, какие пользователи находятся в чате? Используем запрос с JOIN.
SELECT Users.id as userid, Users.name as username
FROM Users INNER JOIN UserInChat ON Users.id = UserInChat.user_id
WHERE UserInChat.chat_id = 123456;
Для добавления пользователя в чат делаем INSERT INTO в таблицу UsersInChat. Для удаление - DELETE FROM. Тут всё как обычно.