Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по БД / 18 сообщений из 18, страница 1 из 1
15.09.2003, 22:35
    #32265673
alkonawtiko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Пишу дипломник.
Суть проблемы в следующем: в моей базе данных "MS Access" все ключевые поля - счётчики. Очень напрягает это руководителя диплома. Говорит что использование счётчиков это плохо. Потому что инкримент счётчика после
редактирования таблицы происходит последовательно и в базе остаются "пробелы"(например после 20-ой записи сразу идёт 120-ая). Убей меня бог если я вижу в этом проблему, но он требует чтобы я все счётчики заменил на числовые значения. И программно (в Delphi) организовал добавление новой записи так, чтобы не было "пробелов". В принципе это не проблема, но так как это организовал я (цикл с проверкой) занимает очень много времени, а в базе всего-то 500 записей. А что будет если в ней будет к
примеру не 500, а 500000 записей? (При добавлении новой записи, пока пройдёт весь цикл, состаришься)
Если кто-то сталкивался с такой бедой или просто знает решение этой проблемы, ПОМОГИТЕ.
...
Рейтинг: 0 / 0
15.09.2003, 22:51
    #32265676
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
--Суть проблемы в следующем: в моей базе данных "MS Access" все ключевые поля - счётчики. Очень напрягает это руководителя диплома.

посоветуй ему сменить место работы.
...
Рейтинг: 0 / 0
15.09.2003, 23:35
    #32265692
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
select min(id)+1 from z1
where (id+1) not in (select id from z1)

так должно помочь отцу русской демократии
...
Рейтинг: 0 / 0
16.09.2003, 03:37
    #32265738
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
присоеденяюсь к тому чтоб посоветовать сменить работу....
а проверять при помощи запросов.. объясни преподу что если два человека вызовут скрипт на получение нового значения "генератора", то получат одинаковые числа и попытаются их вставить. Будет нарушение уникальности... а это уже серьезно.... гораздо серьезнее чем не по порядку следующее значение генератора....
Если тебе нужно нумеровать строки в запросах, то это делается именно в запросах или на том же клиенте.
...
Рейтинг: 0 / 0
16.09.2003, 09:23
    #32265873
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Как вариант, могу посоветовать разделить понятия ID и НОМЕР ДОКУМЕНТА. Я делаю 2 поля для них (если так юзеру хотца номеров "без дырок"). Первое это мое, и юзер даже не догадывается о его существовании, второе его и пусть себе играется с ним как хочет - хоть перенумеровывает если надо. Формирование номера - произвольно, ID - счетчик однозначно.
А твои сомнения обоснованы на 100%, а твой препод - старый дурак, отставший от жизни лет на 40.
...
Рейтинг: 0 / 0
16.09.2003, 11:23
    #32266110
1man
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
>, а твой препод - старый дурак, отставший от жизни лет на 40.
imho, ты не прав! Скорее всего он просто новичок в БД, ни имеющий ни должного опыта, ни, возможно, желания учиться. Такое бывает, особенно на непрофильных для вуза кафедрах, где преп "и швец и жнец и на дуде игрец", т.е. именно преп, а не спец. Ну заставили чела помимо матанализа преподавать еще и БД, которыми он отродясь не занимался! И не хочет заниматься, а токмо учить. Таких надо терпеливо (и осторожно!) воспитывать, образовывать. Иногда помогает :)
...
Рейтинг: 0 / 0
16.09.2003, 12:12
    #32266203
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Вариант, который предложил Серега самый лучший.

В качестве доказательства правомерности применения полей-счетчиков можно сослаться на базу Борей (NorthWind). Там, конечно, сделано довольно туфтово, но для препода ТАКОГО уровня будет авторитетно.
...
Рейтинг: 0 / 0
16.09.2003, 21:44
    #32267095
alkonawtiko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Спасибо всем за помощь!!!
Я нашёл собственный выход из этой ситуации. Может кто-то найдёт в нём какие-то скрытые ошибки, которые могут возникнуть в дальнейшем. Я не нашёл.Суть в следующем:Добавляем в БД ещё одну таблицу с одним единственным числовым полем.Подключаем её как положено в Delphi. В этой таблице будут храниться значения удалённых из основной таблицы полей.
Далее, по нужному вам событию(например Button.OnClick) при добавлении записи в таблицу пишем условие :
IF таблица_с_удалёнными_значениями.RecordCount=0 THEN
основная_таблица_поле.Value:=основная_таблица.RecordCount+1
ELSE
begin основная_таблица_поле.Value:=таблица_с_удалёнными_значениями_поле.Value
таблица_с_удалёнными_значениями.Delete;
end;
какой код нужно написать по нажатию кнопки удалить я не описываю, надеюсь
из выше сказанного это и так ясно.
Последнее, что хотелось бы отметить при использовании этого алгоритма это то, что при отладке программы практически у всех возникают ошибки, не забывайте проверять данные в таблице с удалёнными значениями. А ещё лучше поместите их в DBGrid чтобы было видно. Например: у вас в таблице существуют записи со значениями в ключевых полях - 1; 2; 4; А в таблице с удалёнными значениями, по какой-либо причине отсутствует запись с значением 3; Программа в этом случае сделает следующее: проверит наличие записей в таблице с удалёнными значениями, там ей ответят что таких записей нету, и она смело запустит RecordCount+1. В результате чего получится значение 4, а запись с таким значением уже есть и вот вам ошибка. В общем если грамотно всё сделать, то всё нормально работает. И главное просто.
Если кто-то не согласен, пишите...
...
Рейтинг: 0 / 0
17.09.2003, 04:08
    #32267139
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
alkonawtiko
не согласен
цитирую свою же строчку " если два человека вызовут скрипт на получение нового значения "генератора", то получат одинаковые числа и попытаются их вставить "
...
Рейтинг: 0 / 0
17.09.2003, 07:26
    #32267166
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Вот совершенно реальный сценарий: Добавляется запись в основной таблице. Ключ получается из таблицы удаленных записей. Запись из таблицы удаленных удалять нельзя так, как добавление в основную таблицу еще не сохранено (не все обязательные значения, недопустимые значения, т.д. и т.п). В этот момент к таблице удаленных обращается другой пользователь или приложение. Что он получит в этой ситуации? Кроме того, следить за последовательностью автоинкремента просто излишне, ведь все равно его нельзя использовать для практических данных вроде номера счета, кода товара. Его назначение однозначно идентифицировать запись только и всего.
...
Рейтинг: 0 / 0
17.09.2003, 10:00
    #32267268
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
2alkonawtiko
Про фигню с транзакциями тебе уже написали.
А вот представь, что документ №1 у тебя будет от 31 декабря, а №2 от 1 января одного года . ИМХО, "любителям" дырок в номерах это понравится еще меньше, чем сами дырки.
...
Рейтинг: 0 / 0
17.09.2003, 12:39
    #32267603
Славочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Господа, что вы пристали к студенту. Он же дипломную работу пишет, а не многопользовательское приложение. Здесь главное, чтобы руководителю нравилось - всё остальное вторично.
...
Рейтинг: 0 / 0
17.09.2003, 23:09
    #32268493
alkonawtiko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
БД у меня локальная. Никакой сети на предприятии, где я прохожу практику
и в помине нету. А о проблеме:
"если два человека вызовут скрипт на получение нового значения "генератора", то получат одинаковые числа и попытаются их вставить" я примерно догадывался. Моя ошибка в том, что я не объяснил поподробнее что мне надо. Кстати тот вариант который предложил я,
прошёл у препода на ура. StarWind был прав, когда сказал что
Скорее всего он просто новичок в БД, ни имеющий ни должного опыта, ни, возможно, желания учиться. Такое бывает, особенно на непрофильных для вуза кафедрах, где преп "и швец и жнец и на дуде игрец", т.е. именно преп, а не спец. Ну заставили чела помимо матанализа преподавать еще и БД, которыми он отродясь не занимался!
Был у нас реальный преподаватель (Профессор), но его переманили в
Питер. Но до сих пор все пользуются лишь его лекциями.
Вопрос про БД плавно перешёл в обсуждение преподов...
Спасибо всем !!! А препод пусть жуёт, то что дали. Он это заслужил.
Мой алгоритм он ставит в качестве примера другим :))
Было бы неплохо если этот код он поставил бы в сетевую БД.
Получил бы ( и по заслугам) то, о чём так настойчиво предупреждал StarWind
И наконец отстал бы от студентов со всякой галиматьёй.
Кстати ОН это ОНА, т.е. женщина
...
Рейтинг: 0 / 0
18.09.2003, 00:40
    #32268507
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
alkonawtiko. Радует, что Вы самостоятельно придумали некое решение. Красивое оно или не очень, сейчас не так важно. Будет опыт, будут красивые решения.
==========
В приведенном Вами решении для хранения удаленных номеров используется специальная таблица. Это не есть хорошо, особенно для Acces'а, который не поддерживает транзакции. Ни сколько не ислючен случай, когда запись будет удалена, а ее номер НЕ БУДЕТ вставлен во вспомогательную таблицу.

Но возможны и другие решения.
1. Не удалаять запись физически, а только помечать ее как недействительную (a'la dbf). При необходимости вставить новую запись, сначала ищется, есть ли "недействительные" записи, если есть то в первой из найденных заполняются все поля кроме номера и снимается флаг "недействительности". Если нет, то вставляется запись с номером max(Номер)+1. Способ работоспособный, но несколько гемморойный.

2. Эта задача обычно называется "поиском дырок в последовательности"

Одно из возможных решений. (таблица t, поле n )

select top 1 t.n+1 from t
left outer join t as t1 on t.n=t1.n-1
where t1.n is NULL
order by 1

Этот запрос возвращает первый "пропущенный" номер или, если пропусков нет, следующий номер.
Правда, для его корректной работы нужно иметь в таблице запись с номером равным 0, иначе при удалении номера 1, он не будет отлавливаться
...
Рейтинг: 0 / 0
18.09.2003, 01:10
    #32268521
alkonawtiko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Вы уже второй человек который мне предлагает нечто подобное,
первым был господин Lepsik с таким кодом:
select min(id)+1 from z1
where (id+1) not in (select id from z1)

Вы, в свою очередь предложили:
select top 1 t.n+1 from t
left outer join t as t1 on t.n=t1.n-1
where t1.n is NULL
order by 1

Обязательно попробую, не позднее чем завтра.
Если возникнут проблемы, надеюсь на более подробный "разбор полётов" и соответственно помощь.
...
Рейтинг: 0 / 0
18.09.2003, 03:34
    #32268555
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
только говорил о преподе столь правильные слова не я, а 1man
...
Рейтинг: 0 / 0
18.09.2003, 10:03
    #32268711
1man
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
>"Кстати ОН это ОНА, т.е. женщина"
Ой, блин... Предложение о перевоспитании снимается >8@[
...
Рейтинг: 0 / 0
19.09.2003, 10:42
    #32269966
Малиновский Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по БД
Поведай преподу о безалабеном использовании всем миром GUID-ов.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по БД / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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