LINUX.ORG.RU

проектирование БД

 ,


0

1

Возникла такая проблемка. Каждому объекту в таблице сопоставляется тип объекта из множества 0,1,2,...N-1. N - это число объектов (или записей в таблице). Сейчас таблица спроектирована так

idx type   object
1    0     объект1
5    1     объект2
13   2     объект3
т.е. есть первичный ключ автоинкрементный idx и поле type. Записи вставлялись, удалялись и опять вставлялись и idx не использует все индексы по порядку. А для type нужно чтобы нумерация была неотрицательными числами без их пропуска. Но в этом решении меня не устраивает, что повесил на пользователя ввод значений поля type.

Можно ли оставить только поле type первичным ключом, и как-то заставить СУБД нумеровать записи без пропусков чисел?



Последнее исправление: developer-cpp (всего исправлений: 1)

какая именно базка используется? оракл?

зачем нужны числа без пропуска?

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

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)

Можно попробовать создать второе поле, в котором и хранить такой ид без пропусков. Генерить и следить за ним с помощью процедур самой БД

duck
()
Ответ на: комментарий от duck

Можно попробовать создать второе поле, в котором и хранить такой ид без пропусков. Генерить и следить за ним с помощью процедур самой БД

правильно ли я понимаю, что в SQLite3 не встраиваемых процедур, и следить нужно из основной программы (на C++) ?

developer-cpp
() автор топика

По моему это должно решаться на уровне пользовательского интерфейса.

anonymous
()

Бездырочная нумерация это называется, но на самом деле нужна редко. В единственном случае, когда мне такое понадобилось, это выглядело примерно так:

select id+1 as min_not_used from(select id from cash order by id) as bar where (id+1) not in (select id from cash) LIMIT 1;

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

disarmer ★★★
()

При вставке следующий ID вычисляй исходя из максимального из существующих. При удалении перемещай максимальный не место удаляемого.

kvap
()

Записи вставлялись, удалялись и опять вставлялись

Каков алгоритм смыкания номеров при удалении?

ya-betmen ★★★★★
()
Ответ на: комментарий от disarmer

БД как раз большое, данные для анализа приходится читать порциями (в память целиком не помещаются) ... и вот это поле type из предметной задачи как раз помагает разместить данные для анализа и результат анализа в нужно место.

type - один из индексов в многомерном массиве Data для обработки:

Data[idx0][type][idx2][idx3]
Многомерный массив Data это просто интерфейс к непрерывному участку памяти.

Спасибо всем! На уровне View переделываю «бездырочную нумерацию» для type, а idx выкину :) Советы принимаются

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

. и вот это поле type из предметной задачи как раз помагает разместить данные для анализа и результат анализа в нужно место

Вот никогда в mysql/postgresql таких проблем не возникало... МОжет,можно всё решить так. что дырки не мешают? Погугли пагинацию в php/mysql данных...

Shadow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.