Russian Qt Forum

Qt => Базы данных => Тема начата: dsp от Май 14, 2011, 23:18



Название: База данных для хранения фотографий
Отправлено: dsp от Май 14, 2011, 23:18
Привет.

С бд не работал, но необходимость такая возникла.

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

Вопросы:

1)Из каких таблиц и полей будет состоять бд?
 Мои предположения:
  1 Таблица фотографий
  • id
  • fileName
       
  2 Таблица дерева расположения фотографий относительно этажа
  • id
  • idParentPhoto
  • номер этажа?
   
  3 Таблица отношения фотографий к этажам
  • id
  • photoid
  • floorid

2) Придется писать отдельный менеджер загрузки фотографий в бд, удаления, вывода полей (для контроля правильности) (скорее всего работа будет в режиме клиент-сервер)?

Спасибо.


 


Название: Re: База данных для хранения фотографий
Отправлено: joker от Май 15, 2011, 11:50
1) Не думаю что твой вариант хорошо - у тебя 2 и 3 собирать будет тяжело (если я правильно понял). Я бы сделал:

1. Этажи
id
name
ord (порядок)


2. Фотографии
id
id_floor
ord (порядок)
dta (данные - собсна сама фотка, блоб)


2) А какие еще могут быть варианты? Твой софт - ты и сервисные функции делаешь :) Вот только в отдельной ли программе делать... Тут зависит от того, зачем делается прога. Я бы единую софтинку делал.


Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 15, 2011, 12:16
Думаю правильно: Если образно, то стоишь ты в начале этажа - вот ты пошел от одного его края до другого (фотки должны идти строго друг за другом). Захотел перейти на другой этаж - уже новые фотки и новый порядок.

Что касается пункта 2, то клиенту незачем иметь функции загрузки фото (на данном этапе разработки). Это скорее лишь моя "привилегия", т.к. я должен загрузить фотки, а у клиента свой софт для просмотра.


Название: Re: База данных для хранения фотографий
Отправлено: LisandreL от Май 15, 2011, 12:48
1)
Думаю правильно: Если образно, то стоишь ты в начале этажа - вот ты пошел от одного его края до другого (фотки должны идти строго друг за другом).
То есть какой-нибудь вот такой конфигурации коридора ( с ветвлением и объединением) быть не может:
Код:
начало************
          *      *
          *      *
          *      *
          *      *
          ***************конец
Здесь звёздочки - фотографии.
Такую структуру коридора (а в зданиях встречаются и значительно более сложные) вы ни одним из приведённых способов с базу не закодируете.


Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 15, 2011, 13:19
Структура будет такая:

1й этаж: начало                  2й этаж:начало
                  *                                   *
                  *                                   *
                  */\/\/\/\/\лестница/\/\/\/\ *
                  *                                   *
                  *                                   *
                  *                                   *
                  */\/\/\/\/\лестница/\/\/\/\ *
                  *                                   *
               конец                             конец             ....

Фотки только по цетру



Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 15, 2011, 14:52
А если сделать такие таблицы

(http://s46.radikal.ru/i112/1105/a0/63190c5c82f1.png)

Связь с первой таблицей - через id Фоток. Фоткам дать имена, например (4, 4_1, 4_2 - 4 этаж фотка первая, вторая....). Именование фотографий образует порядок следование.

Либо я чего-то концептуального в построении таблиц не понимаю....


Название: Re: База данных для хранения фотографий
Отправлено: MoPDoBoPoT от Май 15, 2011, 17:02
Нужнавсего лишь одна таблица с такими полями:
  • id
  • photo (BLOB или имя файла)
  • floor
  • order


Название: Re: База данных для хранения фотографий
Отправлено: joker от Май 15, 2011, 18:05
А если сделать такие таблицы

(http://s46.radikal.ru/i112/1105/a0/63190c5c82f1.png)

Связь с первой таблицей - через id Фоток. Фоткам дать имена, например (4, 4_1, 4_2 - 4 этаж фотка первая, вторая....). Именование фотографий образует порядок следование.

Либо я чего-то концептуального в построении таблиц не понимаю....
Насчет порядка - плохая идея... как пример переход с 9 на 10, с 99 на 100 и тп.. А если формат будешь придумывать, то получишь головную боль с его упорядочиванием - не проще ли именно под порядок завести числовое поле  (возможно даже с автоинкременентом).

Да и в принципе, у тебя получается одна плоская таблица, разбитая на 2 части (чтобы труднее выбирать?)
Кстати, это и отметил Павлик:

Нужнавсего лишь одна таблица с такими полями:
  • id
  • photo (BLOB или имя файла)
  • floor
  • order

Однако, как подсказывает практика, потом обязательно захочется "засунуть" для этажа какий-нить параметр (схему опять же в виде рисунка например) и не получится... Или у этажей названия появятся (пентхауз и тп)
Имхо лучше сразу этаж в отдельную сущность


Название: Re: База данных для хранения фотографий
Отправлено: MoPDoBoPoT от Май 15, 2011, 18:32
Однако, как подсказывает практика, потом обязательно захочется "засунуть" для этажа какий-нить параметр (схему опять же в виде рисунка например) и не получится... Или у этажей названия появятся (пентхауз и тп)
Почему это? (:


Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 15, 2011, 18:36
т.е. такая таблица выйдет

(http://s53.radikal.ru/i139/1105/15/4876601de304.png)

а имена файлам какие лучше давать?

А ссылка на файл фоток будет в столбце "Фото"?


Название: Re: База данных для хранения фотографий
Отправлено: LisandreL от Май 15, 2011, 23:34
А ссылка на файл фоток будет в столбце "Фото"?
Если у вас клиент-серверная БД, то логичней там не ссылку (путь к файлу), а саму фотку там хранить.
Иначе, как только клиент и сервер окажутся на разных машинах, а БД будут записанны локальные пути к файлу всё и сломается.

см. Как записать файл в Базу Данных (http://www.prog.org.ru/topic_18085_0.html)


Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 16, 2011, 00:54
LisandreL, спасибо. Сейчас гляну ссылку...


Название: Re: База данных для хранения фотографий
Отправлено: xokc от Май 16, 2011, 19:20
Если у вас клиент-серверная БД, то логичней там не ссылку (путь к файлу), а саму фотку там хранить.
Вообще говоря, вопрос очень о том, что лучше хранить в БД файлы или ссылки на них весьма не тривиален. Есть очень много тем (например на SQL.ru), где это обсуждается. Если коротко, то правильное решение зависит от множества факторов - типа СУБД, среднем объеме файлов, их количестве, необходимости репликации БД и т.п.

Иначе, как только клиент и сервер окажутся на разных машинах, а БД будут записанны локальные пути к файлу всё и сломается.
Вот уж с этим вообще проблем нет - достаточно на сервере реализовать доступ клиенту к каталогу с картинками одним из доступных способов (через хранимые процедуры СУБД, FTP, NFS и т.п.).


Название: Re: База данных для хранения фотографий
Отправлено: LisandreL от Май 16, 2011, 23:14
Вообще говоря, вопрос очень о том, что лучше хранить в БД файлы или ссылки на них весьма не тривиален. Есть очень много тем (например на SQL.ru), где это обсуждается. Если коротко, то правильное решение зависит от множества факторов - типа СУБД, среднем объеме файлов, их количестве, необходимости репликации БД и т.п.
В данном конкретной задаче большой объём не предвидится. Разумеется для больших, сложных, средне/высоко нагруженных систем будут свои нюансы, но это не тот случай.


Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 17, 2011, 21:12
Что должно быть в итоге:

Отдельное приложение для отображения записей базы данных.
Имеет одну кнопку, которая добавляла бы целую папку, содержащую подпапки (с именами 1 floor, 2 floor...) с фотками.

(http://s56.radikal.ru/i152/1105/ca/63d7474c82a5.png)

Я так понимаю, тут рекурсивнй обход нужен?

Зайдя в папку, например 1 floor, копировались бы имена всех фотографий в ней (фотки имели бы имена согласно шаблону №этажа_порядок: 1floor_1order, 1floor_2order...).

Далее, выделяется из имени "№ этажа" и записывается в поле floor. Выделяется "порядок" и записывается в order. Загружаются фотки.

Так вот заполняется таблица.

Что скажете?


Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 20, 2011, 20:08
Почему-то не отображаются названия столбцов QSqlTableModel.

Код:
dbViewer::dbViewer()
{
    model = new QSqlTableModel(this);
    model->setTable("photos");
    model->setHeaderData(0, Qt::Horizontal, "id");
    model->setHeaderData(1, Qt::Horizontal, "file");
    model->setHeaderData(2, Qt::Horizontal, "floor");
    model->setHeaderData(3, Qt::Horizontal, "order");

    model->select();

    view = new QTableView;
    view->setModel(model);

    view->setSelectionMode(QAbstractItemView::SingleSelection);
    view->setSelectionBehavior(QAbstractItemView::SelectRows);
    view->resizeColumnsToContents();
    view->setEditTriggers(QAbstractItemView::NoEditTriggers);

    QHeaderView *header = view->horizontalHeader();
    header->setStretchLastSection(true);
    ...

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(view, 0, 0, 1, 3);
    setLayout(mainLayout);

Сверху:
(http://s43.radikal.ru/i101/1105/6f/21cebe3697d0t.jpg) (http://radikal.ru/F/s43.radikal.ru/i101/1105/6f/21cebe3697d0.png.html)


Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 23, 2011, 11:54
Посмотрите пожалуйста программу для работы с бд.

Что она делает:

Выбирается папка с изображениями, проверяется валидность их имени по шаблону №этажа_№порядка(1floor_1order, 4floor_22order...) кнопкой check.

Кнопка start вмесете с изображениями передает информацию, взятую из имени файла (номер этажа и порядок следования фотографий), создавая таблицу на основе этих данных. Если проверка имени файла выявила неправильные имена файлов, то start блокируется.

Но ничего не отображается в окне, наверно, неправильно таблицу заполняю.

Помогите пожалуйста, очень надо!



Название: Re: База данных для хранения фотографий
Отправлено: dsp от Май 25, 2011, 14:13
Вопрос еще актуален!