Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нагрузка на сеть при использовании Inter Base, Быстродействие приложения 
:(
    Опции темы
akolit
Дата 7.3.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



Эту тему я бы хотел посветить проблеммам правильной работы с сетью.
Вот к примеру!
Есть справочник (с добавлением, удалением и редактированием), и возникает проблемма!
Например два клиента открыли один справочник!
1-й удалил запись "Ставрополь", а 2-й щёлкнул на "Ставрополь" и нажал добавить(в таблицу). Суть проблеммы в том что данные в НД небыли обнавленны и получается что целостность данных нарушенна! (выбран "Ставрополь", но ведт его удалили из справочника!).
Для того чтобы избежать этой проблеммы я написал функцию

String znach;
bool flag=0;

znach="Таблица Справочника"->FieldByName("NAME")->AsString; // сохр. выбранную запись

"Таблица Справочника"->"Транзакция таблици Справочника"->Commit(); // закр. нд
"Таблица Справочника"->Active=true; // откр. нд
while (!"Таблица Справочника"->Eof) //сканируем нд
{
if ("Таблица Справочника"->FieldByName("NAME")->AsString==znach) //ищем сохр-ю запись
flag=1; //найденна
"Таблица Справочника"->Next();
}//while
if(!flag) //если не найденна
MessageBox(Handle,"Запись была удаленна др. пользователем","Ошибка!", MB_OK);
}

(вообще можно использовать поиск по нд, но суть не в этом, ведь всёравно будет сканироваться вся нд).
Суть функции в том, что при попытки выбрать из справочника и добавить запись кудато, программа закрывает нд (commit - подтверждение транзакции), затем открывает и проходит по всем уже новым записям (если было удаление др. клиентом то теперь видно), и если не находит данную, то выдаёт ошибку, после которой пользователь в справочнике видит обнавлённые данные.
Ну так вот у меня вопрос! На сколько это приемлимо с точки зрения нагрузки на сеть? Можно ли так делать? Надоли делать по другому? Как делаете вы?
Зарание спасибо!
PM MAIL   Вверх
Deniz
Дата 7.3.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(akolit @  7.3.2008,  14:41 Найти цитируемый пост)
и получается что целостность данных нарушена!
целостность надо поддерживать на уровне БД, т.е. например,
 - нельзя удалить запись из справочника если в других таблицах есть записи с таким кодом.
 - нельзя добавить запись в таблицу с кодом, которого нет в справочнике
 - и т.д.
В обоих случаях получаем Exception, и корректно даем пользователю понять что произошло.
Это в двух словах, а еще есть куча материала на эту тему.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 7.3.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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

Добавлено через 1 минуту и 25 секунд
Цитата(akolit @  7.3.2008,  11:41 Найти цитируемый пост)
1-й удалил запись "Ставрополь",

если есть внешние ключи, что запись Ставрополь по идее уже не удалишь, т.к. эта запись привязана уже к куче других записей в основных таблицах
PM MAIL   Вверх
akolit
Дата 8.3.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



ТС! Вы не поняли суть! Мы мутим что при редактировании или удалении записи из справочника, прога сканирует все записи таблицы с этой записью и изменяет на введённый вариант! Для этого будет использоваться функция как та которую я написал при открытии этой темы. Мне просто интересно, так можно делать? то что прога будет шибуршить по всей базе, от начала и до конца?
PM MAIL   Вверх
Fortop
Дата 8.3.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Цитата(akolit @  8.3.2008,  11:28 Найти цитируемый пост)
Мне просто интересно, так можно делать? то что прога будет шибуршить по всей базе, от начала и до конца? 

А зачем чему-то вообще шебуршить?

У тебя в справочнике должен использоваться ID записи, а "Ставрополь" и прочая информация может свободно редактироваться (выборки будут извлекать нужную информацию из справочника пользуясь ID, который останется тем же самым).

Вот при удалении - да. Возможны нюансы.

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

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

Это сообщение отредактировал(а) Fortop - 8.3.2008, 19:14


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Akella
Дата 10.3.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Почему  клиент должен "шабуршить"? А что, сервер не может? Ты должен только сказать серверу, что хочешь выполнить такую-то процедуру.... и всё
PM MAIL   Вверх
akolit
Дата 12.3.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



Akella! Кажись понял тебя, видимо надо тригер на удаление написать!

Fortop Спасибо! Токо у меня тода проблемма как по ID справочника, которое записывается в главную таблицу выдать в главной таблице например поле город из справочника? Это типо подстановачное поле как я понял.......

Добавлено через 1 минуту и 19 секунд
Если сервером, то какой код SQL?
PM MAIL   Вверх
Akella
Дата 12.3.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(akolit @  12.3.2008,  09:46 Найти цитируемый пост)
как по ID справочника, которое записывается в главную таблицу выдать в главной таблице например поле город

читай про соединения, JOIN`ы спасут отца русской демократии smile 

Добавлено @ 12:23
Код

select t1.id, t1.text, n.name from treklama t1
left JOIN
tnapr n on (n.id = t1.id_napr)


tnapr - справочник
treklama основная таблица, в которой хранится поле id_napr (т.е. как бы ссылка на поле id из tnapr)

Это сообщение отредактировал(а) Akella - 13.3.2008, 15:02
PM MAIL   Вверх
Fortop
Дата 12.3.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Цитата(akolit @  12.3.2008,  09:46 Найти цитируемый пост)
Fortop Спасибо! Токо у меня тода проблемма как по ID справочника, которое записывается в главную таблицу выдать в главной таблице например поле город из справочника? Это типо подстановачное поле как я понял.......

Можно как предложил Akella Join использовать
а можно подзапросы. Судя по тому что показывает IB Expert - особой разницы нет.

Код

select 
    treklama.id, 
    treklama.text, 
    (select n.name from tnapr where treklama.id_napr = tnapr.id) as ktoto
from  treklama


Добавлено через 7 минут и 43 секунды
Да, и обратный запрос о котором я говорил. Т.е. если из справочника что-то ты удалил, а в treklama есть записи с удаленным ID

То в этот запрос она не попадет.
Код

select 
    tnapr.name,
    (select treklama.id from treklama where tnapr.id = treklama.id_napr) as id_treklama,
    (select treklama.text from treklama where tnapr.id = treklama.id_napr) as text_treklama
from tnapr



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Akella
Дата 13.3.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(Fortop @  12.3.2008,  19:05 Найти цитируемый пост)
Т.е. если из справочника что-то ты удалил, а в treklama есть записи с удаленным ID

чтобы такого бардака не было - нуна использовать ссылочные ограничения, чтобы серер не давал возможности удалять из справочника то, на что ссылается главная таблица
PM MAIL   Вверх
Akella
Дата 13.3.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



если не будешь делать ссылочную целостность, то не забудь сделать индексы для полей ГЛАВНОЙ таблицы, которые ссылаются на ID справочников
PM MAIL   Вверх
Deniz
Дата 13.3.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(Akella @  13.3.2008,  18:11 Найти цитируемый пост)
если не будешь делать ссылочную целостность
не надо такое советовать, там же потом такоооой бардак будет. Это же мина замедленного действия. Даже если попытаться все это реализовать на триггерах.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 13.3.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



я не советую, я предостерегаю smile 
PM MAIL   Вверх
akolit
Дата 15.3.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



Спасыбо! Ну а мы в общем пока зделали так, что главная таблица содержит поле связанное с индесом справочника, а в BUILDERE замутили new fild, и выбрали тип подстановочное и там усё настроили (что оно должно из справочника брать поле name из из записи с нужным id )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.