powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / вопрос по работе с BLOB-полями
25 сообщений из 31, страница 1 из 2
вопрос по работе с BLOB-полями
    #39373788
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня!
Понадобилось добавить фотографии в карточке сотрудников.
Реализовал через GTT-таблицу, пока открыто окно редактирования сотрудника - фотографии добавляются в GTT, затем при нажатии на кнопку ОК - заливаются в постоянную. Вроде как мусор из-за GTT скапливаться не должен.
Но в ходе тестирования заметил одну странность. К примеру заливаю фотографию размером 1.9 МБ, к одному и тому же сотруднику цепляю ее несколько раз. Все отрабатывает нормально, НО, размер БД почему-то меняется не сразу, а спустя какое-то время, и становится чуть больше, чем я ожидаю.
К примеру надо изменить сотрудника 4 раза, каждый раз цепляя фото, и только после 4-го раза размер БД меняется. И меняется на примерно на 9-10 МБ.
Это нормально?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39373797
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik,

при версионности если блоб меняется, или "еще раз прицепляется", то он будет копироваться полностью каждый раз. Если меняется только запись, то ссылка на блоб остается старая, так что блоб не копируется.
Есть аспект с временными блобами
а что касается вообще места - то БД в ФБ 2.5 увеличивается не "постранично", а блоками, см. параметр
DatabaseGrowthIncrement в firebird.conf.

если в БД добавить тучу данных, а потом удалить, то после долгое время БД увеличиваться не будет, т.к. пустое место будет использоваться, и т.д. Так что я советую не париться по этому поводу, за исключением вот такой темы
http://www.ibase.ru/dbgrowth/
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39373820
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikПонадобилось добавить фотографии в карточке сотрудников.
Реализовал через GTT-таблицу, пока открыто окно редактирования сотрудника - фотографии
добавляются в GTT, затем при нажатии на кнопку ОК - заливаются в постоянную.

"Сон разума рожает чудовищ." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39373847
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvвот такой темы
http://www.ibase.ru/dbgrowth/

Кстати! ест там такой параграф...

Еще вариант от Arioch: создано view с конкатенацией строковых столбцов

Таки вот, в моём примере - 14624481 - радость словить можно было не только VIEW, но и COMPUTED BY столбцы в обычной таблице, а вот это упомянуть забыли.

Код: sql
1.
FIO COMPUTED BY ( Fam || ' ' || Nam || ' ' || Sur ) 



Кстати, интересно что будет с SP или с появившимися в FB3 функциями.

Пример тот же - тупо собираем ФИО из отдельных компонент.
Но - внутри функции или внутри SP.

Что-нибудь типа такого

Код: sql
1.
2.
3.
4.
5.
CREATE PROCEDURE USER_FIO ( ID INTEGER NOT NULL )
RETURNS ( FIO VARCHAR(1024) )
AS BEGIN
   SELECT Fam || ' ' || Nam || ' ' || Sur FROM USERS WHERE ID = :ID INTO :FIO;
END 



На момент создания процедуры (или аналогичной функции) столбцы Fam/Nam/Sur были VARCHAR(256)
Потом один из этих столбцов изменился и стал текстовым BLOB'ом.

Процедура - два варианта - то ли была перекомпилирована после изменения таблицы, то ли нет.

Будут ли из процедуры течь BLOB ID ?

Сам :FIO не BLOB, но результат в него BLOB'овый записывается.
Соответственно непонятно как здесь сыграет критерий
при закрытии SQL-оператора, если BLOB-id не выдаются запросом "наружу"

Аналогично, если BLOB ID явно выходят из запроса, но не из процедуры, типа такого

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE PROCEDURE USER_FIO ( ID INTEGER NOT NULL )
RETURNS ( FIO VARCHAR(1024) )
AS 
DECLARE L_FAM AS TYPE OF COLUMN USERS.FAM;
DECLARE L_NAM AS TYPE OF COLUMN USERS.NAM;
DECLARE L_SUR AS TYPE OF COLUMN USERS.SUR;
BEGIN
   SELECT Fam, Nam, Sur FROM USERS 
      WHERE ID = :ID 
      INTO :L_FAM, :L_NAM, :L_SUR;
      
   FIO = :L_Fam || ' ' || :L_Nam || ' ' || :L_Sur;
END 



На момент создания процедуры (или аналогичной функции) столбцы Fam/Nam/Sur были VARCHAR(256)
Потом один из этих столбцов изменился и стал текстовым BLOB'ом.

Будет ли вызов процедуры создавать временные BLOBы, живущие до окончания транзакции,
1) без перекомпиляции процедуры ?
2) после перекомпиляции процедуры ?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39373898
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochНа момент создания процедуры (или аналогичной функции) столбцы Fam/Nam/Sur были VARCHAR(256)
Потом один из этих столбцов изменился и стал текстовым BLOB'ом.

за такие изменения надо руки выдёргивать

AriochБудет ли вызов процедуры создавать временные BLOBы, живущие до окончания транзакции,

Вроде недавно Влад какие-то изменения делал чтобы временные блобы жили до конца активного запроса
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39373902
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

если не держать транзакции неделями - то в общем-то не сильно опасное изменение.
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39373957
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikЭто нормально?Да.

Мы тут с месяцок тому назад с нашим ДБА на пару почистили малёху базу, гигов на десяток, так она с той поры и не растет, стоит себе на отметке 75 гиг и не шелохнется.

Мерить мегабайты прироста базы дело решительно пустое.
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374218
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov"Сон разума рожает чудовищ." (с)

Что это значит? Я пошел сложным путем?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374420
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikЧто это значит?Ну есть еще "буря в стакане воды".
aidynchikЯ пошел сложным путем?скорее бессмысленным.
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374428
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyaidynchikЧто это значит?Ну есть еще "буря в стакане воды".
aidynchikЯ пошел сложным путем?скорее бессмысленным.
Тогда подскажите пожалуйста каким еще можно было пойти...
Вставлять записи сразу в постоянную таблицу не закоммичивая транзакцию?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374453
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikВставлять записи сразу в постоянную таблицу не закоммичивая транзакцию?
мы (вроде) тут не очень поняли вашу исходную идею, т.е. на чем вы собрались экономить.
aidynchikВроде как мусор из-за GTT скапливаться не должен.
gtt у Firebird находятся вне базы данных. Соответственно, про мусор речь не идет.
Если данные вставлять в обычные таблицы, то тоже про мусор не может быть и речи - откуда мусор?

Единственное оправдание вашему решению - это если вы вставляемые данные перед переносом из gtt в БД обновляете раз по 20, причем в разных транзакциях. Однако я не очень понимаю, по каким причинам это может произойти, если речь идет об "окне редактирования сотрудника". Ладно бы если эти редактирования были "сохранением" промежуточного редактирования. Так ведь максимум жизни данных gtt - это в коннекте. А если приложение отвалилось, то и данные из gtt уже не будут видны.
Так зачем здесь gtt?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374456
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
GTT я использовал не из-за BLOB-полей. Я просто не вижу другого выхода при добавлении фото и вообще реквизитов больше одного (например телефоны), которые падают в отдельную таблицу и имеют ссылку на сотрудника.
1) При добавлении к уже имеющемуся сотруднику - да, можно обойтись и без GTT. Но как быть при создании нового сотрудника? Как ее заполнять? Можно вставлять записи с null, затем апдейтить после создания сотрудника, но программа многопользовательская, мало ли там таких записей может быть за это время. ID сотрудника присваивается генератором на момент инсерта в таблицу сотрудников.

2) В вашей ссылке http://www.ibase.ru/dbgrowth/ есть информация о длинных транзакциях. Если вставлять BLOB сразу в обычную таблицу и не коммитить, то есть риск, что транзакция растянется, вдруг юзер посреди редактирования сотрудника пошел пить чай с концами. Это не будет длинной транзакцией? Или я туплю, и чего-то не понимаю в транзакциях?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374463
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik Я просто не вижу другого выхода при добавлении фото и вообще реквизитов больше одного (например телефоны), которые падают в отдельную таблицу и имеют ссылку на сотрудника.
опять я не понимаю. "не вижу другого выхода" - почему? Представьте себе, что в ФБ нет gtt. Что дальше? Случится катастрофа?
aidynchikЕсли вставлять BLOB сразу в обычную таблицу и не коммитить, то есть риск, что транзакция растянется, вдруг юзер посреди редактирования сотрудника пошел пить чай с концами. Это не будет длинной транзакцией? Или я туплю, и чего-то не понимаю в транзакциях?
Во-первых, длинные транзакции действительно зло. Значит, надо сохранять данные в таблицы только после того как пользователь нажмет кнопку "сохранить" (и именно в этот момент стартовать транзацию). А не в самом начале.
Еще раз повторю - с точки зрения потери данных при сбое приложения до сохранения, что гтт, что обычная таблица равнозначны.
Если же вы хотите что-то сохранять в промежутке - тогда да, надо использовать обычные таблицы, и периодически делать коммит.
Во-вторых, вы с блобами что-то попутали.
В статье идет речь про МАССОВЫЕ временные блобы. У вас речь про фотографию сотрудника, ОДНУ. Где вы тут проблему увидели, вообще непонятно.
aidynchikНо как быть при создании нового сотрудника? Как ее заполнять?
ну, вы же собираетесь реально создать нового сотрудника, так? Не баловством же пользователь программы занимается?
Так получите id, создайте сотрудника, сделайте коммит, и добавляйте себе другие данные к этому сотруднику.
Или, получите id, создайте сотрудника, добавляйте данные, и потом делайте коммит.

Кстати, по поводу "пошел пить чай с концами" - вы можете поставить в программе таймер по неактивности пользователя, и через 10-15 минут предупреждать, что несохраненные данные будут потеряны. Красными буквами на весь экран.
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374468
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, извините, я вас подастаю, раз такая возможность =)

kdvВ статье идет речь про МАССОВЫЕ временные блобы. У вас речь про фотографию сотрудника, ОДНУ.

она может быть и не одна, их может быть и десяток, ограничений нет, таково пожелание заказчика.

kdvЗначит, надо сохранять данные в таблицы только после того как пользователь нажмет кнопку "сохранить" (и именно в этот момент стартовать транзацию). А не в самом начале.

Сейчас так и происходит. Пользователь нажимает кнопку "Сохранить", транзакция открывается, делается инсерт в таблицу сотрудников, генерится ID, затем переносятся фото из ГТТ в постоянную на уже имеющийся ID сотрудника, транзакция закрывается.
Как в этом случае мне получить ID сотрудинка заранее? По нажатию на кнопку "Добавить" в интерфейсе - сразу же генерить ID и вставлять фото в постоянную таблицу на этот ID, хотя даже сотрудник еще не вставлен?
Или же вы предлагаете, чтобы программа вначале требовала сохранить сотрудника, а затем только разрешала навешивать на него фотографии и другие множественные реквизиты? Мне кажется это не правильно.
Должно работать так - пользователь нажал кнопку "Добавить", заполнил данные, загрузил фотогрфии, нажал кнопку одну общую кнопку Сохранить - процесс пошел.
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374481
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikКак в этом случае мне получить ID сотрудинка заранее? По нажатию на кнопку "Добавить" в
интерфейсе - сразу же генерить ID и вставлять фото в постоянную таблицу на этот ID, хотя
даже сотрудник еще не вставлен?

1) Сгенерить ID
2) Вставить сотрудника с этим ID
3) Вставить фото и прочие данные с этим ID.

В чём проблема?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374483
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovaidynchikКак в этом случае мне получить ID сотрудинка заранее? По нажатию на кнопку "Добавить" в
интерфейсе - сразу же генерить ID и вставлять фото в постоянную таблицу на этот ID, хотя
даже сотрудник еще не вставлен?

1) Сгенерить ID
2) Вставить сотрудника с этим ID
3) Вставить фото и прочие данные с этим ID.

В чём проблема?

А вдруг дырка в автонумерации?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374486
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
я чего-то не знаю или просто туплю?
В интерфейсе, когда пользователь вставляет фото - они сразу сохраняются в БД, я для того и задействовал ГТТ. Ведь я не могу передать фото массивом в хранимую процедуру, соответственно я сразу кладу их в БД.
Поэтому по вашему пути получается
1) Сгенерил ID
2) При нажатии "добавить фото" - вставил фото с этим id
3) при нажатии "сохранить" вставил сотрудника.
Но это же не логично
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374495
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikя чего-то не знаю или просто туплю?
Обои. Поэтому
aidynchikВ интерфейсе, когда пользователь вставляет фото - они сразу сохраняются в
БД
полный бред.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374499
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищ младший сержантА вдруг дырка в автонумерации?
Тогда стокубово дырка в консерватории.
За автонумерацию в ID - в особо извращенной форме многократно.
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374503
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
хорошо, тогда объясните мне, пожалуйста, как передать массив БЛОБОВ в хранимую процедуру Firebird 2.5
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374509
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik как передать массив БЛОБОВ в хранимую процедуру Firebird 2.5
И как и для чего ты лопатишь во внутри процедуры содержимое этих блобов?
А если не лопатишь их содержимое, то на кукуя они на входе процедуры?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374515
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Di_LIne,
да не лопачу я... и да, в теле процедуры они мне нафиг не нужны.
я понял, все мне тут предлагают, после отработки ХП, запускать отдельные инсерты на вставку блобов
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374519
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikя понял, все мне тут предлагают, после отработки ХП, запускать отдельные инсерты на вставку блобов
Я жеж не все, а по этому икс_клюзив.
По утрам класть в карманы штанов по кирпичу.
На вопль "Азпадлянакуда?!" отвечаю заранее "Инии..фсё, штоп было!".
- Ы?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374521
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik1) Сгенерил ID
2) При нажатии "добавить фото" - вставил фото с этим id
3) при нажатии "сохранить" вставил сотрудника.
Но это же не логично
нелогично - это когда вы почему-то переставили местами пункты 2 и 3. Кто вам сказал, что надо добавить фото фиг знает к кому, т.е. к еще несохраненному сотруднику?
Как вы все то же самое делаете в gtt? почему вы не можете то же самое делать с обычными таблицами?
О каком вообще массиве блобов "передаваемом в процедуру" идет речь? Вы что, в gtt тоже передаете массив блобов?

Короче. В обычных таблицах вы можете делать все то же самое, что и сейчас с GTT. Боязнь какого-то там мусора из-за длинных транзакций - так вы не понимаете природу версионности. Любая активная read-write транзакция, даже если она ничего не делает - ни в гтт, ни в обычные таблицы ничего не пишет - все равно является причиной накопления версий в БД.
Прочитайте
http://www.ibase.ru/mga/
Если уже читали - второй раз, третий, и т.д.

Вы себе чего-то там придумали, начали чесать левое ухо правой рукой, и теперь спрашиваете "как же мне быть"?
...
Рейтинг: 0 / 0
вопрос по работе с BLOB-полями
    #39374524
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikя понял, все мне тут предлагают, после отработки ХП, запускать отдельные инсерты на вставку блобов
1. откуда взялась ХП?
2. почему вы не можете с обычными таблицами работать так же, как сейчас работаете с гтт?
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / вопрос по работе с BLOB-полями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]