фона«Юридический» определенная последовательность
У меня есть много разных «вещи» (домен конкретный элемент/объект/при условии), которые видны «вещь» владельцы (люди). Владельцы собираются идентифицировать свои «вещи» с числом. Вместо того, чтобы показывать большое «случайное» число, я хочу показать им небольшое число (предпочтительно последовательность, начинающуюся с 1), которая проще для людей. Владельцам очень удобно говорить о «моем foo 37» и «ее баре 128». Там «последовательность» может иметь пробелы, но прикрепленный номер должен оставаться неизменным во время жизни «вещи». Поэтому мне нужен способ генерировать «вещь» + собственный идентификатор владельца (в настоящее время называемый «видимым идентификатором»).
Количество комбинаций «вещь» + владелец в масштабе 10k +. В настоящее время новые «вещи» не могут динамически генерироваться, но владельцы могут быть.
Количество экземпляров «штуки» на одного владельца относительно невелико, примерно десяток на одного владельца, но нет жесткой крышки, которая может быть получена из бизнес-правил. Новые экземпляры «вещи» создаются и удаляются часто.
Рассматриваемые варианты
Я нашел хорошее обсуждение в SO вопрос Oracle Partitioned Sequence, что обращается в значительной степени тот же вопрос, у меня есть.
До сих пор я рассмотрел следующие варианты:
- Я думаю, что стандартная последовательность базы данных будет прекрасно, но это потребовало бы мне динамически создавать большое количество «вещь» + владелец специфических последовательностей и также разрешает имя последовательности во время вставки. (И отбросьте последовательности, когда владелец ушел.) Я не уверен, что создание огромного количества последовательностей - хорошая практика вообще (мне 10 000 + объектов базы данных - огромное количество).
- Я также считал печально известным
max(visible_id) + 1
, но мы столкнемся с обычными проблемами параллелизма с этим, так что это не-go. - Не сохраняйте отдельный идентификатор владельца в базе данных, а вместо этого создавайте его в виде suggested по Adam Musch. Это замечательная идея, но, к сожалению, идентификатор должен быть таким же во время жизни экземпляра «вещь».
- Избегайте всей проблемы, позволяя владельцам назвать «вещь». Но им совсем не понравилась идея - «Почему я должен беспокоиться, так легко сказать foo 16.»!
Вопрос
Есть ли какой-либо другой способ решения этой проблемы, или я должен начать создавать последовательности динамически? Если последовательности являются ответом, пожалуйста, уточните, какие подводные камни могут быть (например, неявные фиксации в DDL).
Меня интересуют как решения Oracle 11gR2, так и 12c (если они разные).
Псевдо-код для иллюстрации постановка вопроса
create table foo (
id number primary key -- the key for computers
,owner_id number
,visible_id number -- the key for humans
,data_ varchar2(20)
);
create constraint foo_u1 unique foo(owner_id, visible_id);
-- primary key sequence
create sequence foo_id_seq;
insert into foo values(
foo_id_seq.nextval
,1
,1 -- what to put here ?
,'lorem ipsum'
);
insert into foo values(
foo_id_seq.nextval
,2
,1 -- what to put here ?
,'dolor sit amet'
);
select visible_id, data_ from foo where owner = 2 order by visible_id;
Почему опция 3 не применяется? Какие экземпляры могут быть удалены? Что, если пометить их как удаленные (например, через дополнительный столбец)? –
Я не понимаю, почему # 2 создаст проблемы параллелизма, когда MAX (visible_id) привязан к определенному владельцу (вам определенно не нужно макс. Всей таблицы). Возможно ли, что владелец будет обновлять свои товары в одно и то же время из более чем одного экземпляра приложения? Похоже, вам нужен первичный ключ на столе, владелец, штука. Thingid должен быть сгенерирован вами, поэтому я бы предложил использовать хранимую процедуру для обновления/вставки/удаления, чтобы вы могли управлять последовательностью, но вы хотите вместо прямого вызова операций dml. – Matt
@ KonstantinSorokin Ну ... потому что ... Я просто могу сказать, что я был слеп для этого варианта. Да, я знаю о [soft delete] (http://stackoverflow.com/q/2549839/272735), и да, моя первая идея в том, что здесь может быть неплохо. Мне нужно больше обдумать эту идею, преимущества и недостатки. – user272735