@HexUserHex

Правильно ли связанны мои таблицы в sqlite?

Приветствую,

1. Вопрос
Сразу уточню что я не эксперт в БД, и мне на данном этапе просто требуется найти рабочее решение.
Есть таблица users которая содержит данные о пользователе, у пользователя может быть фото с изображением лица либо просто фото с 'котиком'. В случае если на фото изображено лицо то данные о фото должны сохранятся в таблицу faces в случае если на фото изображено что то другое то данные о фото сохраняться в таблицу photos, у каждого пользователя только одно фото.

Вот как на данном этапе я это реализовал, буду рад если исправите.

CREATE TABLE IF NOT EXISTS users(id_faces INTEGER  NOT NULL, 
								id_photos INTEGER NOT NULL, 
								registration_date TEXT, 
								actual_name TEXT, 
								real_name TEXT, 
								old_names TEXT, 
								friends INT, 
								level INT, 
								country TEXT, 
								profile_summary TEXT, 
								src TEXT)
			
			
			
CREATE TABLE IF NOT EXISTS faces(id_faces INTEGER, 
								 h1 INT, 
								 FOREIGN KEY (id_faces) REFERENCES users (id_faces))


CREATE TABLE IF NOT EXISTS photos(id_photos INTEGER, 
								  h1 INT, 
								  FOREIGN KEY (id_photos) REFERENCES users (id_photos))


2. Вопрос
в python-е получаю число(на самом деле массив чисел) вот в таком формате:
6.1000e+01
Как мне его проще сохранять в sqlite базу(не округляя) и далее доставать из базы для сравнения? Можно пример?
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
@o5a
1. Лучше не разделять таблицы с фото на 2 разных. Судя по описанию задачи структура и хранимые в них данные абсолютно идентичны по сути. Так что лучше использовать единственную таблицу для хранения всех этих вариантов фото. А для разделения (лицо/котики/возможно еще какой вариант захотите добавить) использовать отдельное поле в таблице, photo_type например.
2. В представленном коде у Вас из таблицы фотографий идет FK на таблицу пользователей. Если таблица фото предполагает хранение самих данных (что за поле h1? это сами данные фото?), то правильнее сделать наоборот: в таблице пользователей хранить id из таблицы фото, с соответствующим FK.
Т.е. примерно так
CREATE TABLE IF NOT EXISTS users(user_id INTEGER  NOT NULL PRIMARY KEY, 
                photo_id INTEGER NOT NULL, 
                registration_date TEXT, 
                actual_name TEXT, 
                real_name TEXT, 
                old_names TEXT, 
                friends INT, 
                level INT, 
                country TEXT, 
                profile_summary TEXT, 
                src TEXT,
FOREIGN KEY (photo_id) REFERENCES photos(id))

CREATE TABLE IF NOT EXISTS photo_type(photo_type INTEGER PRIMARY KEY,
                  photo_type_name TEXT)

CREATE TABLE IF NOT EXISTS photos(id INTEGER PRIMARY KEY AUTOINCREMENT,
                  photo_type INTEGER,
                  h1 INT,
FOREIGN KEY (photo_type) REFERENCES photo_type(photo_type))

3. По формату данных. Можно хранить как INT, FLOAT, насколько знаю там еще вроде можно NUMERIC, это как аналог десятичного числа.
6.1000e+01

А точно у Вас десятичные числа? Приведенный пример по факту целое число 61.
массив из 256 не целых чисел в базу(гистограмму картинки)

Как таковых массивов sqlite насколько знаю не поддерживает. Чтобы хранить придется заносить каждое число в отдельную строку с соблюдением порядка (id autoincrement в принципе с этим справится). Не факт, что это лучший вариант хранения этих данных, ведь по факту насколько я понимаю никогда не понадобится выбрать конкретное число из этой гистограммы, она нужна всегда только как массив - полностью записываем, полностью считываем.
Так что для такой задачи возможно лучше не плодить их в таблице, а просто завести текстовое поле и хранить там этот список чисел в виде json. В sqlite можно даже написать автоматическое преобразование данных, т.е. в колонку пишется список, а сохраняется как json, аналогично при чтении. Пример.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@qwertiss
Числа можете хранить как строку или float
У того и другого ограничение в 1 миллиард вроде или миллион. Ван этого точно должно хватить
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы