Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
Пишу дипломник. Суть проблемы в следующем: в моей базе данных "MS Access" все ключевые поля - счётчики. Очень напрягает это руководителя диплома. Говорит что использование счётчиков это плохо. Потому что инкримент счётчика после редактирования таблицы происходит последовательно и в базе остаются "пробелы"(например после 20-ой записи сразу идёт 120-ая). Убей меня бог если я вижу в этом проблему, но он требует чтобы я все счётчики заменил на числовые значения. И программно (в Delphi) организовал добавление новой записи так, чтобы не было "пробелов". В принципе это не проблема, но так как это организовал я (цикл с проверкой) занимает очень много времени, а в базе всего-то 500 записей. А что будет если в ней будет к примеру не 500, а 500000 записей? (При добавлении новой записи, пока пройдёт весь цикл, состаришься) Если кто-то сталкивался с такой бедой или просто знает решение этой проблемы, ПОМОГИТЕ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 22:35 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
--Суть проблемы в следующем: в моей базе данных "MS Access" все ключевые поля - счётчики. Очень напрягает это руководителя диплома. посоветуй ему сменить место работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 22:51 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
select min(id)+1 from z1 where (id+1) not in (select id from z1) так должно помочь отцу русской демократии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 23:35 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
присоеденяюсь к тому чтоб посоветовать сменить работу.... а проверять при помощи запросов.. объясни преподу что если два человека вызовут скрипт на получение нового значения "генератора", то получат одинаковые числа и попытаются их вставить. Будет нарушение уникальности... а это уже серьезно.... гораздо серьезнее чем не по порядку следующее значение генератора.... Если тебе нужно нумеровать строки в запросах, то это делается именно в запросах или на том же клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 03:37 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
Как вариант, могу посоветовать разделить понятия ID и НОМЕР ДОКУМЕНТА. Я делаю 2 поля для них (если так юзеру хотца номеров "без дырок"). Первое это мое, и юзер даже не догадывается о его существовании, второе его и пусть себе играется с ним как хочет - хоть перенумеровывает если надо. Формирование номера - произвольно, ID - счетчик однозначно. А твои сомнения обоснованы на 100%, а твой препод - старый дурак, отставший от жизни лет на 40. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 09:23 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
>, а твой препод - старый дурак, отставший от жизни лет на 40. imho, ты не прав! Скорее всего он просто новичок в БД, ни имеющий ни должного опыта, ни, возможно, желания учиться. Такое бывает, особенно на непрофильных для вуза кафедрах, где преп "и швец и жнец и на дуде игрец", т.е. именно преп, а не спец. Ну заставили чела помимо матанализа преподавать еще и БД, которыми он отродясь не занимался! И не хочет заниматься, а токмо учить. Таких надо терпеливо (и осторожно!) воспитывать, образовывать. Иногда помогает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 11:23 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
Вариант, который предложил Серега самый лучший. В качестве доказательства правомерности применения полей-счетчиков можно сослаться на базу Борей (NorthWind). Там, конечно, сделано довольно туфтово, но для препода ТАКОГО уровня будет авторитетно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 12:12 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за помощь!!! Я нашёл собственный выход из этой ситуации. Может кто-то найдёт в нём какие-то скрытые ошибки, которые могут возникнуть в дальнейшем. Я не нашёл.Суть в следующем:Добавляем в БД ещё одну таблицу с одним единственным числовым полем.Подключаем её как положено в Delphi. В этой таблице будут храниться значения удалённых из основной таблицы полей. Далее, по нужному вам событию(например Button.OnClick) при добавлении записи в таблицу пишем условие : IF таблица_с_удалёнными_значениями.RecordCount=0 THEN основная_таблица_поле.Value:=основная_таблица.RecordCount+1 ELSE begin основная_таблица_поле.Value:=таблица_с_удалёнными_значениями_поле.Value таблица_с_удалёнными_значениями.Delete; end; какой код нужно написать по нажатию кнопки удалить я не описываю, надеюсь из выше сказанного это и так ясно. Последнее, что хотелось бы отметить при использовании этого алгоритма это то, что при отладке программы практически у всех возникают ошибки, не забывайте проверять данные в таблице с удалёнными значениями. А ещё лучше поместите их в DBGrid чтобы было видно. Например: у вас в таблице существуют записи со значениями в ключевых полях - 1; 2; 4; А в таблице с удалёнными значениями, по какой-либо причине отсутствует запись с значением 3; Программа в этом случае сделает следующее: проверит наличие записей в таблице с удалёнными значениями, там ей ответят что таких записей нету, и она смело запустит RecordCount+1. В результате чего получится значение 4, а запись с таким значением уже есть и вот вам ошибка. В общем если грамотно всё сделать, то всё нормально работает. И главное просто. Если кто-то не согласен, пишите... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 21:44 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
alkonawtiko не согласен цитирую свою же строчку " если два человека вызовут скрипт на получение нового значения "генератора", то получат одинаковые числа и попытаются их вставить " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 04:08 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
Вот совершенно реальный сценарий: Добавляется запись в основной таблице. Ключ получается из таблицы удаленных записей. Запись из таблицы удаленных удалять нельзя так, как добавление в основную таблицу еще не сохранено (не все обязательные значения, недопустимые значения, т.д. и т.п). В этот момент к таблице удаленных обращается другой пользователь или приложение. Что он получит в этой ситуации? Кроме того, следить за последовательностью автоинкремента просто излишне, ведь все равно его нельзя использовать для практических данных вроде номера счета, кода товара. Его назначение однозначно идентифицировать запись только и всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 07:26 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
2alkonawtiko Про фигню с транзакциями тебе уже написали. А вот представь, что документ №1 у тебя будет от 31 декабря, а №2 от 1 января одного года . ИМХО, "любителям" дырок в номерах это понравится еще меньше, чем сами дырки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 10:00 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
Господа, что вы пристали к студенту. Он же дипломную работу пишет, а не многопользовательское приложение. Здесь главное, чтобы руководителю нравилось - всё остальное вторично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 12:39 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
БД у меня локальная. Никакой сети на предприятии, где я прохожу практику и в помине нету. А о проблеме: "если два человека вызовут скрипт на получение нового значения "генератора", то получат одинаковые числа и попытаются их вставить" я примерно догадывался. Моя ошибка в том, что я не объяснил поподробнее что мне надо. Кстати тот вариант который предложил я, прошёл у препода на ура. StarWind был прав, когда сказал что Скорее всего он просто новичок в БД, ни имеющий ни должного опыта, ни, возможно, желания учиться. Такое бывает, особенно на непрофильных для вуза кафедрах, где преп "и швец и жнец и на дуде игрец", т.е. именно преп, а не спец. Ну заставили чела помимо матанализа преподавать еще и БД, которыми он отродясь не занимался! Был у нас реальный преподаватель (Профессор), но его переманили в Питер. Но до сих пор все пользуются лишь его лекциями. Вопрос про БД плавно перешёл в обсуждение преподов... Спасибо всем !!! А препод пусть жуёт, то что дали. Он это заслужил. Мой алгоритм он ставит в качестве примера другим :)) Было бы неплохо если этот код он поставил бы в сетевую БД. Получил бы ( и по заслугам) то, о чём так настойчиво предупреждал StarWind И наконец отстал бы от студентов со всякой галиматьёй. Кстати ОН это ОНА, т.е. женщина ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 23:09 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
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, он не будет отлавливаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 00:40 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
Вы уже второй человек который мне предлагает нечто подобное, первым был господин 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 Обязательно попробую, не позднее чем завтра. Если возникнут проблемы, надеюсь на более подробный "разбор полётов" и соответственно помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 01:10 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
только говорил о преподе столь правильные слова не я, а 1man ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 03:34 |
|
||
|
Вопрос по БД
|
|||
|---|---|---|---|
|
#18+
>"Кстати ОН это ОНА, т.е. женщина" Ой, блин... Предложение о перевоспитании снимается >8@[ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2003, 10:03 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32267268&tid=2116819]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 362ms |

| 0 / 0 |
