Вопрос Вопрос о реализации таблицы sql

Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
242
Реакции[?]
23
Поинты[?]
18K
у меня значит пользователи должны писать какие фрукты они хотят отслеживать, и вот как мне сделать.
кучу булинов с каждым доступным фруктом или один текст куда буду добавлять фрукты
UPD блять сформулировал вопрос и почувстовал себя кончелыгой
Для просмотра содержимого вам необходимо авторизоваться.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
21 Мар 2021
Сообщения
94
Реакции[?]
29
Поинты[?]
7K
Какая СУБД? SQLite? Зачем блобы если можно для этого строки использовать?
 
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
242
Реакции[?]
23
Поинты[?]
18K
Какая СУБД? SQLite? Зачем блобы если можно для этого строки использовать?
ой я когда прочитал описание блоба там было написано что это двоичный объект и я это интерпретировал как то что он хранит только один бит и это здешний boolean
сори ща перепишу пост
aiosqlite
 
Начинающий
Статус
Оффлайн
Регистрация
21 Мар 2021
Сообщения
94
Реакции[?]
29
Поинты[?]
7K
ой я когда прочитал описание блоба там было написано что это двоичный объект и я это интерпретировал как то что он хранит только один бит и это здешний boolean
сори ща перепишу пост

aiosqlite
blob нужен для хранения не не булинок, а бинарных данных, т.е. массива байтиков любой длины (главное не уйти за лимиты SQLite'а).
Для bool в SQLite следует использовать INTEGER(1) и хранить в нём либо 0, что интерпретируется как false, либо 1 - true.

Если у тебя кол-во фруктов ограничено и ты их хочешь сам вбить их список, то можно использовать связь many-to-many из 3-ех табличек, тогда ERD-диаграмма будет выглядеть так:
1704984110342.png
А SQL-скрипт для создания табличек так:

SQL:
CREATE TABLE IF NOT EXISTS Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(512)
);

CREATE TABLE IF NOT EXISTS Fruits (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(512)
);

CREATE TABLE IF NOT EXISTS UsersFruits (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL REFERENCES Users(id) ON DELETE CASCADE,
    fruit_id INTEGER NOT NULL REFERENCES Fruits(id) ON DELETE CASCADE
);
P.S. в SQLite изначально выключена поддержка внешних ключей, включить можно так:

Python:
# Разрешение использования внешних ключей
await database.execute("PRAGMA foreign_keys = ON;")
await database.commit()
Если тебе нужно чтобы все было совсем примитивно, то создай связть one-to-many:

SQL:
CREATE TABLE IF NOT EXISTS Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(512)
);

CREATE TABLE IF NOT EXISTS UsersFruits (
    id INTEGER PRIMARY KEY AUTOINCREMENT,

    fruit_name VARCHAR(512),
    user_id INTEGER NOT NULL REFERENCES Users(id) ON DELETE CASCADE
);
В таком случае у тебя будет не 3 таблички, а 2.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
242
Реакции[?]
23
Поинты[?]
18K
blob нужен для хранения не не булинок, а бинарных данных, т.е. массива байтиков любой длины (главное не уйти за лимиты SQLite'а).
Для bool в SQLite следует использовать INTEGER(1) и хранить в нём либо 0, что интерпретируется как false, либо 1 - true.

Если у тебя кол-во фруктов ограничено и ты их хочешь сам вбить их список, то можно использовать связь many-to-many из 3-ех табличек, тогда ERD-диаграмма будет выглядеть так:
Посмотреть вложение 268225
А SQL-скрипт для создания табличек так:

SQL:
CREATE TABLE IF NOT EXISTS Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(512)
);

CREATE TABLE IF NOT EXISTS Fruits (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(512)
);

CREATE TABLE IF NOT EXISTS UsersFruits (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL REFERENCES Users(id) ON DELETE CASCADE,
    fruit_id INTEGER NOT NULL REFERENCES Fruits(id) ON DELETE CASCADE
);
P.S. в SQLite изначально выключена поддержка внешних ключей, включить можно так:

Python:
# Разрешение использования внешних ключей
await database.execute("PRAGMA foreign_keys = ON;")
await database.commit()
Если тебе нужно чтобы все было совсем примитивно, то создай связть one-to-many:

SQL:
CREATE TABLE IF NOT EXISTS Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(512)
);

CREATE TABLE IF NOT EXISTS UsersFruits (
    id INTEGER PRIMARY KEY AUTOINCREMENT,

    fruit_name VARCHAR(512),
    user_id INTEGER NOT NULL REFERENCES Users(id) ON DELETE CASCADE
);
В таком случае у тебя будет не 3 таблички, а 2.
оке ты уже третий кто мне советует так что попробую, но вообще я это изначально представлял как
SQL:
id INTEGER PRIMARY KEY
flame INTEGER(1)
falcon INTEGER(1)
и так еще где то 30 раз. чем плох метод
 
Начинающий
Статус
Оффлайн
Регистрация
21 Мар 2021
Сообщения
94
Реакции[?]
29
Поинты[?]
7K
оке ты уже третий кто мне советует так что попробую, но вообще я это изначально представлял как
id INTEGER PRIMARY KEY
flame INTEGER(1)
falcon INTEGER(1)
и так еще где то 30 раз. чем плох метод
Такова идеология реляционных баз данных - хранить всё в виде отдельных, но связанных между собой табличек.
В случае если тебе нужно будет дропнуть одну из табличек - другие останутся, если у неё конечно нет внешних ключей, в моём примере при удалении пользователя его фрукты тоже будут удалены.
Ну и масштабировать базу тебе будеть чуть-чуть удобнее.
 
Сверху Снизу