Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Открыть новую тему     Написать ответ в эту тему

miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Maximus777

Цитата:
AlexCoRu
Цитата:
мне не нравится, что записи вставленные позже будут иметь меньший id.
 
Именно это и произойдёт, если ID удалённой строки делать "свободным". А если устроить "перестройку", то всё получится вполне благообразно

Встречные вопросы, на которые отвечать не обязательно, но подумать надо которыми можно.
 
Документ как правило имеет табличную часть (позиции накладной как пример) и хидер (заголовок, шапку, оглавление). В табличной части соответственно делается поле-ссылка на шапку, чтобы разделить, какие позиции к какому документу относятся. Внимание, вопроссы!  
А что вы собираетесь делать с табличными частями документов после перенумерации шапок? Также перенумеровывать?  
А что делать с трегерами на обновление, которые обязательно появятся (если уже не появились)?  
А что делать, когда понадобиться удалить документ месячной давности и это удаление потянет за собой каскадный пересчет всей базы на пару часов в середине рабочего дня?  
А что делать, когда ваша программа распечатает документ с номером 234, его выдадут какому-то человеку, потом кто-то удалит документы 123 и 200 с соответствующими изменениями, а потом придет человек с бумажкой на которой написано "234"?
 
Maximus777

Цитата:
Не осознаю, в чём будет заключаться бардак

Есть два пути чтобы осознать. Первый - делать как хотите, ходить по всех граблях, которые я описал (а их намного больше, очень-очень намного) с соответствующими разгребаниями, разборками с начальством/клиентами и прочими нервотрепками. А второй - потратить пару дней на изучение теории СУБД и особенно многопользовательского режима работы.  
Выбор за вами.

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 11:54 18-09-2012
ant0ni02004

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
тяжело помочь т.к. не совсем понятно какая цель этого механизма...
ведь правда не для того, чтобы скрыть сам факт наличия(когда-то) и последующего удаления документа?

Цитата:
Не осознаю, в чём будет заключаться бардак

не хочется повторять то, что уже выше написали, но вкратце
у вас были документы в таблице

Код:
ID=1, NUM=1;ID=2, NUM=2;ID=3, NUM=3;ID=4, NUM=4

удалили ID=3

Код:
ID=1, NUM=1;ID=2, NUM=2;ID=4, NUM=4

да, вы можете перестроить ID-шники(со всеми предосторожностями и foreign-ссылками!) и получить

Код:
ID=1, NUM=1;ID=2, NUM=2;ID=3, NUM=4

тут бардака, допустим, нет
но тогда по отсутствию номера док-та №3(именно номера, не ИД!) дырка вычисляется
а если еще и номер переколбасить - тогда будет бардак, как выше и написали

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 15:38 18-09-2012 | Исправлено: ant0ni02004, 15:41 18-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые, вы куда-то в неведомые дали унеслись. Никакого криминала я не замыслил. База используется у меня в офисе для собственных внутренних нужд (а именно, упорядочивание инфы по обзвону потенциальных клиентов). Никакие документы не печатаются. Только раз в месяц выбирается инфа из базы для отчёта (типа отчёт за месяц). ID при этом никак не используется, кроме как для красоты. Т.е. его никто, кроме меня, не видит вообще. О каком бардаке речь?! Откуда такая паранойя?
 
jonikDk
Цитата:
Вопрос, какие книги про СУБД вы читали?  
Как мне кажется - ни одной.

Перед тем, как задать вопрос, проштудировал такую - Borri - Firebird Rukovodstvo razrabotchika baz dannyx [RU].djvu. Хотя Вы правы, опыт мой почти нулевой. И прочтение теории мне не очень помогает, мне бы пример рабочий ...
 
Ещё раз попробую объяснить суть задачи. В таблице, у каждой строки есть свой ID, присваиваемый по генератору в момент добавления этой самой строки в базу. Например, 1,2,3,4,5,6,7. Значение генератора на этот момент равно 7. Затем удаляется строка с ID = 3. Необходимо, сразу после удаления, 4,5,6,7 превратить в 3,4,5,6 и генератору присвоить значение 6. Строки, имеющие ID ниже, чем у удаляемой никак не трогать. Строк, превышающих ID удаляемой строки, будет крайне мало, поэтому это не должно занять много времени.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 16:37 18-09-2012
volser

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
На эту таблице нет ссылок foreign key? Зачем вообще это делать? Чем не устраивают иды которые идут не по порядку, если они никуда не выводятся?

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 20:08 18-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
volser
Цитата:
На эту таблице нет ссылок foreign key?

Нет.
 
volser
Цитата:
Зачем вообще это делать?

Если это невозможно сделать или Вы не знаете, как это сделать, то так и скажите. К чему все эти "наводящие" вопросы?

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:03 18-09-2012
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Только раз в месяц выбирается инфа из базы для отчёта (типа отчёт за месяц)
А как часто заносится?

Цитата:
ID при этом никак не используется, кроме как для красоты
Тогда зачем он вообще?

Цитата:
Необходимо, сразу после удаления, 4,5,6,7 превратить в 3,4,5,6
Сразу может и не получится, т.к. какая-либо из записей 4,5,6,7 будет блокирована.
 
 
Добавлено:
По-моему, генератор не нужен вовсе. Достаточно двух триггеров AfterDelete и BeforeInsert.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 21:35 18-09-2012 | Исправлено: AlexCoRu, 21:37 18-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
Цитата:
А как часто заносится?

Каждый день.
 

Цитата:
Тогда зачем он вообще?

А хз, я уже сам не помню, зачем его задумывал
 

Цитата:
По-моему, генератор не нужен вовсе. Достаточно двух триггеров AfterDelete и BeforeInsert.

Наверное так, но это мои первые шаги и мне было понятнее с генератором.
 
Короче, решил проблему с перестройкой ID, через процедуру. Мне не трудно вручную, иногда, наводить красоту. Правда хотелось разобраться с триггерами, с чем их "едят" ...
 

Код:
SET TERM ^ ;
CREATE PROCEDURE REMAKE_ID (
    STID integer,
    ENID integer )
AS
BEGIN
  WHILE (stid<enid) DO
    BEGIN
      UPDATE CLIENT_CATALOG SET ITEM_ID=:stid-1 WHERE ITEM_ID=:stid;
      stid=:stid+1;
  END
END^
SET TERM ; ^

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:17 18-09-2012
ant0ni02004

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777

Цитата:
Никакого криминала я не замыслил

а вам его никто и не шьёт  

Цитата:
К чему все эти "наводящие" вопросы?

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

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 23:45 18-09-2012
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777

Цитата:
Если это невозможно сделать или Вы не знаете, как это сделать, то так и скажите. К чему все эти "наводящие" вопросы?

На sql.ru в таких случаях принято говорить: «Там обрыв, но вам туда можно». И это очень точно отражает суть. Если вам так сильно хочется пробежаться по краю обрыва, то, безусловно, никто не имеет права вам мешать. Но только не обижайтесь, что помогать никто не рвется.
 
Касаемо тригеров с генераторами и работы с ФБ вообще - рекомендую еще книгу Вострикова и Ковязина «Мир Interbase». Довольно просто, понятно и доходчиво все расписано.
 
А ваша процедура REMAKE_ID заменяется одним запросом, кстати:
 

Код:
 
update client_catalog set item_id = item_id - 1 where item_id > :param1
 

где param1 - идентификатор удаленной записи.
 
Кстати, есть еще один вариант работы с базами данных: данные не удаляются никогда. При необходимости в таблице заводится поле типа deleted и когда пользователь удаляет запись, в это поле ставится значение 1. А все выборки с базы данных идут с условием

Код:
 
where deleted = 0
 

Таким образом и необходимая вам бездырочная нумерация соблюдается и никто из более опытных товарищей не напрягается по этому поводу :)

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 23:50 18-09-2012 | Исправлено: miwa, 23:53 18-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ant0ni02004
Цитата:
ну не может быть такая красота только ради красоты

Может.
 

Цитата:
если вдруг нужно выводить номера в вашем отчете чтобы красиво подряд шли, или количество подсчитывать  - так так и скажите, это решается без перестройки ID

В отчёте этих номеров нет.
 
miwa
Цитата:
Касаемо тригеров с генераторами и работы с ФБ вообще - рекомендую еще книгу Вострикова и Ковязина «Мир Interbase». Довольно просто, понятно и доходчиво все расписано.

Спасибо за совет. Постараюсь изучить данный материал.
 

Цитата:
А ваша процедура REMAKE_ID заменяется одним запросом, кстати:

Код:
update client_catalog set item_id = item_id - 1 where item_id > aram1

И правда работает. Хотя я пробовал так, но были жалобы на дубли. Правда сейчас у меня подозрение, что я знак использовал "<" (по невнимательности).
 

Цитата:
Кстати, есть еще один вариант работы с базами данных: данные не удаляются никогда.  

Уверяю Вас, те данные, которые я удаляю, никому не понадобятся в будущем и никакого фатализма не доставят. Это, как правило, неправильно введённые данные (пользователи следом вводят верные). А из интерфейса, который используют пользователи, доступен только ввод информации.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 06:30 19-09-2012
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777

Цитата:
Уверяю Вас, те данные, которые я удаляю, никому не понадобятся в будущем и никакого фатализма не доставят. Это, как правило, неправильно введённые данные (пользователи следом вводят верные). А из интерфейса, который используют пользователи, доступен только ввод информации.

Тут дело даже не в нужности конкретных данных, а в самом принципе, в подходе к работе. Вам сейчас оно неинтерессно и ненужно, но иногда накладные затраты на удаления чего-либо столь велики, что это удаление никогда не делают. Может, помните, был год-два назад скандал с «вконтактом», когда они отказывались удалять пользовательские данные, ссылаясь как раз на техническую невозможность.  
 
Ну или еще пример, тоже не совсем и вашей области, но похоже. Есть шапка документа и табличная часть. В табличной части - отсылки на многие другие таблицы из базы данных - справочник товаров/услуг, валюты там, штрих-коды всякие. Вот, пользователь решает удалить весь документ. А что делать с зависимими таблицами? Удалять ли записи с справочника товаров? А если штрих-коды генерируются по специальному (не бездырочному, но что-то похожее) алгоритму? Ну и куча других подобных нюансов.
 
Но это все так, мысли в сторону.
 
Вот, кстати, еще. Если вы предпочитаете практику, посмотрите на ресурс sql-ex.ru - там как раз голая практика. Тренировка по составлению самых разных запросов на любые случаи жизни. Вы наверняка удивитесь, узнав, сколько всего можно сделать обычным запросом (а не только перенумеровать документы)

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 10:13 19-09-2012
jonikDk



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Перед тем, как задать вопрос, проштудировал такую - Borri - Firebird Rukovodstvo razrabotchika baz dannyx [RU].djvu. Хотя Вы правы, опыт мой почти нулевой. И прочтение теории мне не очень помогает, мне бы пример рабочий ...

Ну вот начало есть это хорошо.  
Вот мы все с практической точки зрения и советуем тебе не делать глупостей
А понятие красоты у каждого своё, а вот целесообразность данного действа понимается с опытом работы в многопользовательском режиме. Если ты это не можешь понять, то проще себе сказать, что это табу, так мне сказали умные люди
Потом когда наберешься опыта и поймешь, скажешь спасибо
 
Добавлено:
Да и еще, подумай над таким вопросом:
Одновременно создали запись 3 клиента  
1 получил id - 10
2 получил id  -11
3 получил id - 12
Но 1 и 2 затем решили отменить ввод документа или произошла ошибка при вводе (это не важно, важно, что документ не сохранился) у тебя получится ряд id - 9,12 то есть будет дырка в два номера
И я не понимаю, чем тебе поможет твой update в таком случае.  

Всего записей: 1599 | Зарегистр. 01-03-2004 | Отправлено: 10:52 19-09-2012 | Исправлено: jonikDk, 11:03 19-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
miwa
Цитата:
Ну или еще пример, тоже не совсем и вашей области, но похоже. Есть шапка документа и табличная часть. В табличной части - отсылки на многие другие таблицы из базы данных - справочник товаров/услуг, валюты там, штрих-коды всякие. Вот, пользователь решает удалить весь документ. А что делать с зависимими таблицами? Удалять ли записи с справочника товаров? А если штрих-коды генерируются по специальному (не бездырочному, но что-то похожее) алгоритму? Ну и куча других подобных нюансов.

Это всё совершенно неоспоримо. Но у меня одна база, одна табличка и никаких ссылок. Если в будущем они (ссылки) появятся, то и мои подходы изменятся.
 
jonikDk
Цитата:
Да и еще, подумай над таким вопросом:  
 Одновременно создали запись 3 клиента  
 1 получил id - 10  
 2 получил id  -11  
 3 получил id - 12

У меня этого нет. 1 - это ID1, 2 - это ID2. Клиент не имеет уникального ID, его имеет каждая строка в табличке. Не спрашивайте зачем так сделано, сам не знаю. Я только учусь. При этом стараюсь совмещать приятное с полезным.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 12:45 19-09-2012
jonikDk



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
У меня этого нет. 1 - это ID1, 2 - это ID2. Клиент не имеет уникального ID, его имеет каждая строка в табличке. Не спрашивайте зачем так сделано, сам не знаю. Я только учусь. При этом стараюсь совмещать приятное с полезным.


Ну так я это и имел в виду.
Распишу еще раз, есть три пользователя, вводят документы в твою таблицу:
1 пользователь вводит документ, сгенерировался id записи равный 10  
2 пользователь вводит документ, сгенерировался id записи равный 11
3 пользователь вводит документ, сгенерировался id записи равный 12
 
1 и 2 пользователи не сохранили документы, 3 сохранил. Получилась дырка, в твоей таблице id будут иметь значения - 1,2,3,4,5,6,7,8,9,12.
Где в этом случае твоя красота? Или здесь я делаю красиво, а здесь фиг с ним?
 

Всего записей: 1599 | Зарегистр. 01-03-2004 | Отправлено: 13:22 19-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
jonikDk
Цитата:
1 и 2 пользователи не сохранили документы, 3 сохранил.

В моём случае так не бывает . Если была нажата кнопка "ОК", то данные ушли в базу. А когда они входили в базу, то все сопутствующие причиндалы им были присвоены (ID и т.д.). Пока пользователи вводят инфу, база отдыхает. Если пользователь закрыл форму добавления, то и в базу ничего не ушло. Понимаете? События "сгенерирован ID" и "документ сохранён" происходят в один и тот же момент времени.
 
"Дырку" могу сделать только я сам, как правило по просьбе пользователей, чтобы удалить некорректную инфу. После этого я "делаю красиво" И делаю я это совсем другим инструментом, если быть точным, то с помощью FlameRobin. Из пользовательского интерфейса (который в моём случае представлен в Excel) удалить данные невозможно.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 13:59 19-09-2012 | Исправлено: Maximus777, 14:13 19-09-2012
jonikDk



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В моём случае так не бывает . Если была нажата кнопка "ОК", то данные ушли в базу. А когда они входили в базу, то все сопутствующие причиндалы им были присвоены (ID и т.д.). Пока пользователи вводят инфу, база отдыхает. Если пользователь закрыл форму добавления, то и в базу ничего не ушло. Понимаете? События "сгенерирован ID" и "документ сохранён" происходят в один и тот же момент времени.

Ха, в момент когда пользователь нажал кнопку сохранить, сосед прикольнулся и выдернул шнур из ethernet разъема. Произошла любая другая ошибка при сохранении. То что при сохранении не произойдет ошибки, ты не можешь гарантировать.  

Цитата:
События "сгенерирован ID" и "документ сохранён" происходят в один и тот же момент времени.

Очень смелое утвеждение
Цитата:
 
"Дырку" могу сделать только я сам, как правило по просьбе пользователей, чтобы удалить некорректную инфу.

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

Всего записей: 1599 | Зарегистр. 01-03-2004 | Отправлено: 14:25 19-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
jonikDk, вот кусок макроса, в котором происходит добавление инфы в базу:
 

Код:
v = "'" + n3 + "', '" + Telephones.Text + "', '" + CStr(Now) + "', '" + FIO.Text + "', '" + Profession.Text + k + ", " + nd + Komment.Text + "', CURRENT_USER, " + CStr(status) + "," + CStr(tip_kontakt)
     
    s = "INSERT INTO CLIENT_CATALOG (ITEM_ID,ITEM_NAME,ITEM_CONTACTS,ITEM_DATA,ITEM_CONTACT_NAME,ITEM_CONTACT_PROFESSION,ITEM_KOMPLEKT,ITEM_DATA_NEXT,ITEM_KOMMENT,ITEM_USER,ITEM_STATUS,ITEM_TIP) " & _
    "VALUES (GEN_ID(id_gen,1)," + v + ")"
    rst.Open s, conn, adOpenDynamic, adLockOptimistic, auto_commit = True

 
Нужны ли здесь какие-то супергарантии? Я думаю, это излишне.
 

Цитата:
Программы надо писать так, чтобы участие программиста сводилось к минимуму.

Я именно с такого вопроса и начал, но до сих пор так и не получил примера. Одно воспитание ...

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 15:02 19-09-2012
jonikDk



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Нужны ли здесь какие-то супергарантии? Я думаю, это излишне.

Ну как минимум, может быть ошибка в данных - слишком длинная строка.
Также могут быть и другие ошибки, при сохранении.
 

Цитата:
Я именно с такого вопроса и начал, но до сих пор так и не получил примера

Пожалуйста, пример.
Сделай своему пользователю интерфейс для удаления данных.
И забей на дырки в id, они все равно будут, такова практика многопользовательского режима.

Цитата:
Одно воспитание ...

Почему же, было пожелание, почитать доку, даже книгу посоветовали.
На этом я пожалуй прекращу "воспитание", каждый сам себе кузнец . Желающий услышать, да услышит...

Всего записей: 1599 | Зарегистр. 01-03-2004 | Отправлено: 15:19 19-09-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
jonikDk
Цитата:
Сделай своему пользователю интерфейс для удаления данных.

Пусть вводят внимательно, тогда не будет нужды удалять.
 

Цитата:
И забей на дырки в id, они все равно будут, такова практика многопользовательского режима.

Настоящие гусары не в силах забить на дырки  

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 15:38 19-09-2012
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Кстати, а что будет, если вредный пользователь введет такой коментарий:
 
Текст коментария"; delete from client_catalog;
 
ну, скажем, из вредности? Или детальный комментарий на 32КБ - из старательности и исполнительности?

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 15:48 19-09-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru