powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор PK
46 сообщений из 46, показаны все 2 страниц
Выбор PK
    #33216966
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С поиском на скуле снова туговато, поэтому не бейте, если вопрос уже задавали.
Мимоходом слышал, о том что выбор identity field в качестве PK - кривое решение. Хочется узнать почему?
К примеру у нас имеется несколько областных серверов и один центральный. У каждого из серверов PK - это identity с определенной областью значений, которая не перекрывается PK других серверов. Кроме PK конечно же есть ещё и unique key. Все областные сервера реплицируются на центральный сервер. Манипулировать, настраивать репликацию и пр. пр., по-моему легче с PK из одного поля, чем составным. В чем же тогда цимус?
...
Рейтинг: 0 / 0
Выбор PK
    #33217129
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Манипулировать, настраивать репликацию и пр. пр., по-моему легче с PK из одного поля, чем составным.
Это почему?
...
Рейтинг: 0 / 0
Выбор PK
    #33217175
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanЭто почему?
:) Берём просто манипуляцию (при репликации я получаю горизонтальные и вертикальные сабсеты, поэтому репликацию сюда сунул).
ведь куда проще написать:
Код: plaintext
1.
2.
3.
select *
from table1 t1
where t1.id not in (select t2.id from table2 t2)
чем
Код: plaintext
1.
2.
3.
select *
from table1 t1
where (t1.id1, t1.id2, t1.id3....) <> (select....

Не могу найти, кто говорил про минусы identity as PK пока поиск не работает. Просто сейчас стало интересно - почему?
...
Рейтинг: 0 / 0
Выбор PK
    #33217274
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГостиМимоходом слышал, о том что выбор identity field в качестве PK - кривое решение. Хочется узнать почему?
Возможно я не понимаю, что такое identity field, но если не ошибаюсь, его для этого и придумывали. Соответственно, такое утверждение эквивалентно утверждению "identity не должны использоваться".

На аргументацию этого утверждения и мне хотелось бы полюбоваться. Единственный вариант, который я вижу - недобитый фанатик естественных ключей.
...
Рейтинг: 0 / 0
Выбор PK
    #33217298
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
identity - автоинкрементное поле.
...
Рейтинг: 0 / 0
Выбор PK
    #33217323
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну хорошо, положим что у вас единственное поле в ПК, причем разбито по диапозонам для филиалов. И пусть все ложится в консолидированную базу.
И, пожалуйста нарисуйте мне запрос сгруппируйте все по филиалам. Или положим в каком-то филиале грохнулась база. Сделайте экстракт данных для этого филиала из консолидированной. И, путь допустим диапазон по какой-либо причине перекрылся (мало ли какая ошибка) что делать в этом случае? Я не говорю что все это сделать невозможно. Пусть каждый живет с тем геморроем который ему нравится. Удачи.
...
Рейтинг: 0 / 0
Выбор PK
    #33217336
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гости gardenmanЭто почему?
:) Берём просто манипуляцию (при репликации я получаю горизонтальные и вертикальные сабсеты, поэтому репликацию сюда сунул).
ведь куда проще написать:
Код: plaintext
1.
2.
3.
select *
from table1 t1
where t1.id not in (select t2.id from table2 t2)
чем
Код: plaintext
1.
2.
3.
select *
from table1 t1
where (t1.id1, t1.id2, t1.id3....) <> (select....
it depends
в постгресе работает конструкция
where [NOT] (t1.id1, t1.id2, t1.id3....) in (select id1,id2,id3 FROM ....)
при этом ничто не мешает писать и так:
where NOT EXISTS (select ... WHERE t2.id1=t1.id1 AND t2.id2=t1.id2 AND t2.id3=t1.id3)
...
Рейтинг: 0 / 0
Выбор PK
    #33217350
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу хорошо, положим что у вас единственное поле в ПК, причем разбито по диапозонам для филиалов. И пусть все ложится в консолидированную базу.
И, пожалуйста нарисуйте мне запрос сгруппируйте все по филиалам. Или положим в каком-то филиале грохнулась база. Сделайте экстракт данных для этого филиала из консолидированной. И, путь допустим диапазон по какой-либо причине перекрылся (мало ли какая ошибка) что делать в этом случае? Я не говорю что все это сделать невозможно. Пусть каждый живет с тем геморроем который ему нравится. Удачи.
что за? объясните по порядку, чем здесь составной ключ будет лучше не составного и с чего такой тон?
...
Рейтинг: 0 / 0
Выбор PK
    #33217367
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гости чем здесь составной ключ будет лучше не составного и с чего такой тон?
ключ(ид_филиала, ид_чегохошь) свободен от необходимости расщеплять поле, и от возможности наложения интервалов ("паашибке"). А т.к. это оказалось непонятным - то видимо и тон.
...
Рейтинг: 0 / 0
Выбор PK
    #33217373
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, а теперь сравним эти запросы по производительности с простым
select * from table where filial=..., причем поле filial первое поле первичного ключа.))) Я соглашусь, что можно такую фигню использовать если в табличке несколько тысяч записей. А если несколько миллионов? Интересно на какую производительность вы расчитываете?
...
Рейтинг: 0 / 0
Выбор PK
    #33217394
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321it depends
в постгресе работает конструкция
where [NOT] (t1.id1, t1.id2, t1.id3....) in (select id1,id2,id3 FROM ....)
при этом ничто не мешает писать и так:
where NOT EXISTS (select ... WHERE t2.id1=t1.id1 AND t2.id2=t1.id2 AND t2.id3=t1.id3)
конструкции не важны в принципе. Вопрос о выборе PK: составной or identity.

Берем другой пример: внешние ключи в БД.
При составном ключе, внешний ключ тоже будет составным.

зы. я не являюсь ярым сторонником того или другого метода. Мне интересно почему кое-кто считает identity злом?
...
Рейтинг: 0 / 0
Выбор PK
    #33217414
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы. я не являюсь ярым сторонником того или другого метода. Мне интересно почему кое-кто считает identity злом?
Зло не identity, а неразумное его его использование повсюду.
...
Рейтинг: 0 / 0
Выбор PK
    #33217436
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanАга, а теперь сравним эти запросы по производительности с простым
select * from table where filial=..., причем поле filial первое поле первичного ключа.))) Я соглашусь, что можно такую фигню использовать если в табличке несколько тысяч записей. А если несколько миллионов? Интересно на какую производительность вы расчитываете?

и что? кроме первичного ключа в виде identity - обязательно есть альтернативный ключ. пусть filial будет "первым полем альтернативного ключа" - что изменится в производительности?
...
Рейтинг: 0 / 0
Выбор PK
    #33217477
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем нужно два индекса, если можно обойтись одним?
...
Рейтинг: 0 / 0
Выбор PK
    #33217524
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА зачем нужно два индекса, если можно обойтись одним?

для вот этого к примеру:

Код: plaintext
1.
2.
delete from table1 t1
where t1.id in (select t2.id from table2 t2 where t2.altkey1="sdf" and t2.altkey2="23" ....)
куда более понятней, чем
Код: plaintext
1.
2.
delete from table1 t1
where (t1.pk1, t1.pk2, ....) in (select t2.fk1, t2.fk2, .... from table2 t2 where ....
id-identity as PK
altkey - alternative key
pk - primary key
fk - foreign key

надо будет кстати протестировать подобное, что быстрее:
поиск по индексу составного альтернативного ключа + поиск по уникальному не составному индексу или
поиск по индексу составного внешнего ключа + поиск по составному уникальному индексу?
...
Рейтинг: 0 / 0
Выбор PK
    #33217556
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему это вы решили что у вас в системе будет только поиск по индексу ? Намекаете на INDEX ORING/ANDING? Думаете это простые операции? А insert, update, delete? Вы попробуйте куда будут вставляться быстрее записи -
в табличку где один индекс или два?
Если табличка у вас - просто справочник который обновляется пару раз в день, то конечно можно нарисовать пару десятков индексов. А если это не так?
...
Рейтинг: 0 / 0
Выбор PK
    #33217591
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА почему это вы решили что у вас в системе будет только поиск по индексу? Намекаете на INDEX ORING/ANDING? Думаете это простые операции? А insert, update, delete? Вы попробуйте куда будут вставляться быстрее записи -
в табличку где один индекс или два?
Если табличка у вас - просто справочник который обновляется пару раз в день, то конечно можно нарисовать пару десятков индексов. А если это не так?

ок. Для OLTP - схема действительно не самая подходящая. Ура, наконец то что то есть.
А вот по поводу поиска только/не только по индексу:
причем здесь это? при table scan и пр. неиндексиронном поиске как будет влиять структура ключа?
...
Рейтинг: 0 / 0
Выбор PK
    #33217612
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanИ, пожалуйста нарисуйте мне запрос сгруппируйте все по филиалам.
Код: plaintext
select ... group by division_id

gardenmanИли положим в каком-то филиале грохнулась база. Сделайте экстракт данных для этого филиала из консолидированной.
Ээ.. надо писать?

Хотя в первую очередь надо не экстракт делать, а админа увольнять, у которого в мирное время невосстановимо грохается база.

gardenmanИ, путь допустим диапазон по какой-либо причине перекрылся (мало ли какая ошибка) что делать в этом случае?
Писать прокламацию производителю СУБД. Примерно так - я, мол, делаю

Код: plaintext
create sequence S minvalue  1000  maxvalue  2000 

а он, сволочь, полез в чужой диапазон.

gardenmanЯ не говорю что все это сделать невозможно. Пусть каждый живет с тем геморроем который ему нравится.
Вот уж точно. Я правильно понимаю, что для Вас group by division_id - аргумент за составной ключ?
...
Рейтинг: 0 / 0
Выбор PK
    #33217653
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНамекаете на INDEX ORING/ANDING? Думаете это простые операции?
INDEX ORING/ANDING в вышеприведенном примере с запросами как то имеет значение? Запросы со стороны кол-ва индексов и ORING/ANDING равноправны имхо. черт с ними это частный случай. Сейчас подумаю, где ORING/ANDING для identity и составного будут в пользу того или другого...
...
Рейтинг: 0 / 0
Выбор PK
    #33217655
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА зачем нужно два индекса, если можно обойтись одним?
Можно обойтись и вообще без индексов. Вопрос в том, нужно ли.

Вопрос "что есть оптимально", как мы все догадываемся, вряд ли имеет конкретный и одновременно универсальный ответ. Например, пара индексов PK:(id_field), INDEX:(division, field_a, field_b, field_c) запросто может оказаться предпочтительнее, нежели пара индексов PK:(division, field_a), INDEX:(division, ....)
...
Рейтинг: 0 / 0
Выбор PK
    #33217823
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Я правильно понимаю, что для Вас group by division_id - аргумент за составной ключ?
нет, аргумент тут скорее редкая, но таки возможная ситуация, когда базы ставились как заведомо независимые (т.е. никто не написал заранее разных минимумов и максимумов на диапазоны), а потом таки оказалось, что данные надо слить. Кажется таки отапдейтить ид_дивижна проще, чем сдвинуть счетчик (некоторые субд к тому же проверяют уникью на каждую запись, а не на стейтмент - придеца делать апдейт на ОрдернутуюБайДеск таблицу - лишние слова в пестне, однако).
...
Рейтинг: 0 / 0
Выбор PK
    #33217838
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ. кстати мой вариант ключа такой:
(ид_филиал, счетчик),
а не десять полей.

Но это скорее от привычки иметь дело с базами (в филиалах), где изначально нет ни ай-ди_филиал, ни выделенных диапазонов.
...
Рейтинг: 0 / 0
Выбор PK
    #33217876
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно обойтись и вообще без индексов. Вопрос в том, нужно ли.
Ну если проектировать базу так как вы советуете, то в конце концов как раз так и получится, что система не будет использовать индексы несмотря на то, что они есть.

Я правильно понимаю, что для Вас group by division_id - аргумент за составной ключ?
А вам этого аргумента значит не хватает?

пара индексов PK:(division, field_a), INDEX:(division, ....)
А с чего это вы решили, что второй индекс я обязательно начну с division?
А вдруг у меня имеются поля с большей селективностью?
И вообще, я говорил о том, что этот ваш второй индекс мне может вообще не понадобится.

И вообще сыр-бор как я понимаю только из-за того, что кто-то очень хочет писать
update/delete... where id=:id
вместо
update/delete .... where (division_id,id)=(:division_id,:id)

потому, что в первом варианте короче?

Сдается мне что причина вообще несколько в другом. У MSSQL имеется только IDENTITY поле, которое обязательно подразумемает индекс. У того же Оракла и ДБ2 есть SEQUENCE. (У ДБ2 есть и IDENTITY тоже в дополнение к SEQUENCE).
Соответственно и подходы диктуются используемым сервером БД.
...
Рейтинг: 0 / 0
Выбор PK
    #33217895
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321нет, аргумент тут скорее редкая, но таки возможная ситуация, когда базы ставились как заведомо независимые (т.е. никто не написал заранее разных минимумов и максимумов на диапазоны), а потом таки оказалось, что данные надо слить. Кажется таки отапдейтить ид_дивижна проще, чем сдвинуть счетчик
Первое, что в этом случае придется делать - ВВОДИТЬ ид_дивижна, поскольку в "заведомо независимых" базах его не будет. Второе - переписывать все селекты, которые про ид_дивижна знать ничего не знают (в данном случае я предполагаю, что авторы СУБД не настолько законченные идиоты, чтобы пользоваться NATURAL JOIN или аналогичными неявными конструкциями). Ну и само собой, потребуется решить еще кучу неприятных вопросов - согласование справочников, сведение данных, изменения задним числом...

В общем, я бы сказал, это практически в любом случае настолько неприятная процедура, что лучше не давать ей шанса на жизнь. Наверное, можно найти случаи, когда вместо ид_дивижна можно заюзать какой-то подходящий справочник и решить задачу дешево, типа "был справочник с записями ОТДЕЛ1, ОТДЕЛ2, стал справочник с записями ФИЛИАЛ1_ОТДЕЛ1, ФИЛИАЛ1_ОТДЕЛ2", но это вряд ли часто возможно и это совершенно точно не очень-то хорошо.
...
Рейтинг: 0 / 0
Выбор PK
    #33217913
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Преписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать.
ALTER TABLE - может и придется сделать а вот переписывать селекты - зачем?

А если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто...
...
Рейтинг: 0 / 0
Выбор PK
    #33217955
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделайте так:

В пределах одного филиала ключ интовый идентити, а в в межфилиальном пространстве uniqueidentifier соответствующий интовому. И будет Вам счастье.
...
Рейтинг: 0 / 0
Выбор PK
    #33217967
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИ вообще сыр-бор как я понимаю только из-за того, что кто-то очень хочет писать
update/delete... where id=:id
вместо
update/delete .... where (division_id,id)=(:division_id,:id)

потому, что в первом варианте короче?
мне надоели эти выпады. А если предположить некое интранет/интернет приложение, которое выводит строки из БД, для последующей модификации/удаления. Самый простой способ - это передать единственный параметр, уникально определяющий запись, чем массив параметров. В большом приложении - это становится настоящей проблемой отслеживать такие вещи. Или вы против того, что чем проще механизм тем он надежнее?

авторСдается мне что причина вообще несколько в другом. У MSSQL имеется только IDENTITY поле, которое обязательно подразумемает индекс. У того же Оракла и ДБ2 есть SEQUENCE. (У ДБ2 есть и IDENTITY тоже в дополнение к SEQUENCE).
Соответственно и подходы диктуются используемым сервером БД.
вряд ли используемый сервер здесь имеет значение. хотя может быть именно отсутствие SEQUENCE для AS/400 и побудило нашу команду использовать IDENTITY и проч? или всё таки удобство?
...
Рейтинг: 0 / 0
Выбор PK
    #33217971
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanПреписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать.
Давайте смотреть. Две таблицы, СОТРУДНИКИ и ЗАРПЛАТЫ. Сделали alter table, добавили в каждую поле "филиал". Выполняем запрос:

Код: plaintext
1.
select с.имя_сотрудника, з.величина_зарплаты
from Сотрудники c join Зарплата з on (c.ид_сотрудника = з.ид_сотрудника)

Внимание, вопрос: куда меня пошлет бухгалтер, когда я потребую у него все приписанные мне зарплаты?
...
Рейтинг: 0 / 0
Выбор PK
    #33217995
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вопросик можно?
Вы в какой базе этот запрос делаете?
В базе филиала или в консолидированной базе?
Если в базе филиала - то никаких проблем.
А если в консолидированной - это ее проблемы :))
...
Рейтинг: 0 / 0
Выбор PK
    #33218009
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА вопросик можно?
Вы в какой базе этот запрос делаете?
В базе филиала или в консолидированной базе?
Если в базе филиала - то никаких проблем.
А если в консолидированной - это ее проблемы :))

а какие могут быть проблемы в консолидированной? Селективность у уникального индекса куда как очень хорошая. Так ведь? Или о чем вы?
...
Рейтинг: 0 / 0
Выбор PK
    #33218013
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Гости
На счет AS/400 не знаю. Знаю на счет DB2UDB - на самом деле там IDENTITY нет. Есть только SQUENCE. Для каждого поля IDENTITY неявно создается свой SEQUENCE. Это все видно в представлениях каталога.
А написать свою функцию на C, которая раздавала бы IDENTITY ничего не стоит. Было бы желание. :)
...
Рейтинг: 0 / 0
Выбор PK
    #33218026
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто...
Если - как предложил мой собеседник - задача стартует с "независимо установленных систем", в ней на 100% будут коллизии в id-шниках. Если диапазоны изначально удерживаются различными - собственно, имеем вполне нормальную ситуацию с identity, нет никаких причин делать составной ключ. Почему нет? Давайте ограничимся индексами. Итак, изначально есть индекс

PK:(table_id)

С введением понятия филиала добавляются потенциальные индексы:

AK:(table_id, division_id)
AK:(division_id, table_id)

Первый из них почти бессмысленен, хорош только тем, что запрос вида

Код: plaintext
select division_id from table where table_id = :table_id

выполнится несколько быстрее. Второй - вообще бессмысленен за исключением разве что некоторых order by-ев.
...
Рейтинг: 0 / 0
Выбор PK
    #33218038
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА если в консолидированной - это ее проблемы
Тогда не понимаю, почему Вы сами не ответили на собственный вопрос "как в таком случае сделать группировку по филиалам". Ровно этими же словами.

Правда, если мне доведется заказывать софт на стороне, я предпочту исполнителя, не имеющего привычки отвечать "это ваши проблемы". Нехай он сидит со своими составными ключами, а я куплю работающую систему.
...
Рейтинг: 0 / 0
Выбор PK
    #33218129
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> У каждого из серверов PK - это identity с определенной областью
> значений, которая не перекрывается PK других серверов.

Откуда уверенность, что они не перекрываются? Каковы правила раздачи диапазонов? Каковый правила выделения диапазонов при добавлении серверов? Каковы правила выделения диапазонов при необходимости деления филиалов?
...
Рейтинг: 0 / 0
Выбор PK
    #33218468
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОткуда уверенность, что они не перекрываются? Каковы правила раздачи диапазонов? Каковый правила выделения диапазонов при добавлении серверов? Каковы правила выделения диапазонов при необходимости деления филиалов?
а это что за подозрения такие и как они относятся к теме дискуссии?
Посмотрите, хотя бы пример софтварера - есть сомнения, что значения выйдут за диапазон? Я тоже уверен, что у нас они всегда будут уникальны для всей системы в целом.
...
Рейтинг: 0 / 0
Выбор PK
    #33218587
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> а это что за подозрения такие и как они относятся к теме дискуссии?

Я читаю первое (Ваше) сообщение этого треда. Вижу описание примера, которое на мой взгляд, является типично кривым. Т. е. "выбор identity field в качестве PK - кривое решение" - ответ нет. А вот Ваш пример - это пример кривого решения. Отсюда и вопросы.

> Посмотрите, хотя бы пример софтварера - есть сомнения, что значения
> выйдут за диапазон?

Чего пример, простите? Что мне этот пример должен объяснить?

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

Я и прошу поделиться Вашей уверенностью. На чем-то ведь она основана, правда? Вопросы - сообщением выше.
...
Рейтинг: 0 / 0
Выбор PK
    #33218628
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ читаю первое (Ваше) сообщение этого треда. Вижу описание примера, которое на мой взгляд, является типично кривым. Т. е. "выбор identity field в качестве PK - кривое решение" - ответ нет. А вот Ваш пример - это пример кривого решения. Отсюда и вопросы.


identitiy генерится через одну таблицу, затем префиксуется/постфиксуется условным кодом области, полученное id используется в кач-ве первичного ключа в остальных документах БД. Это решение сильно кривое?

авторЧего пример, простите? Что мне этот пример должен объяснить?

softwarercreate sequence S minvalue 1000 maxvalue 2000 - эта конструкция достаточно однозначна - значения не выходят за диапазон.
...
Рейтинг: 0 / 0
Выбор PK
    #33218716
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Это решение сильно кривое?

Смотря с чем сравнивать.

> identitiy генерится через одну таблицу, затем префиксуется/постфиксуется
> условным кодом области, полученное id используется в кач-ве первичного ключа
> в остальных документах БД.

Т. е. условный код добавляется в начало первичного ключа и в конец (префикс + id + суффикс; префикс = суффиксу), так? Каков размер первичного ключа? Что Вы собираетесь делать при необходимости описывать филиалы филиалов?

> create sequence S minvalue 1000 maxvalue 2000 - эта конструкция достаточно
> однозначна - значения не выходят за диапазон.

Это понятно. А почему Вы считаете, что заявленного диапазона Вам должно хватить (причем, в сильно урезанном виде из-за алгоритма формирования первичного ключа)?
...
Рейтинг: 0 / 0
Выбор PK
    #33218822
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСмотря с чем сравнивать.
а че его сравнивать, для задачи, которая у нас есть - это было самым оптимальным решением.

авторТ. е. условный код добавляется в начало первичного ключа и в конец (префикс + id + суффикс; префикс = суффиксу), так? Каков размер первичного ключа? Что Вы собираетесь делать при необходимости описывать филиалы филиалов?

префикс ИЛИ суффикс - у нас префикс. Некоторые делают суффикс - это не имеет значения. размер первичного ключа - integer+2 символа префикса. филиалы филиалов (даже если они будут, что вряд ли :) ) получат свой префикс вот и все.

авторЭто понятно. А почему Вы считаете, что заявленного диапазона Вам должно хватить (причем, в сильно урезанном виде из-за алгоритма формирования первичного ключа)?
в нашем случае диапазон иссякнет не очень скоро. сколько там под интегер отведено? кажется 4 байта, + 2 байта префикс даже при нынешней нагрузке (5000 записей в день) - этого хватит надолго
...
Рейтинг: 0 / 0
Выбор PK
    #33218847
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanПреписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать.
ALTER TABLE - может и придется сделать а вот переписывать селекты - зачем?

А если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто...
Можно ввести корпоративный Identity и пусть филиалы при помощи него между собой и "старшим братом" сношаются
ЗЫ
Филиалы его(corpo_identity) почитывают, а старший брат пописывает
...
Рейтинг: 0 / 0
Выбор PK
    #33218870
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, на каждом уровне должен быть свой, самостоятельный(для уровня) identity
...
Рейтинг: 0 / 0
Выбор PK
    #33219017
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> для задачи, которая у нас есть - это было самым оптимальным решением.

Если Вы говорите "оптимальным", было бы правильно приводить при этом критерии оптимальности. Абстрактно оптимальных решений не бывает.

> размер первичного ключа - integer+2 символа префикса.

А храните Вы его как? В виде текста?

> филиалы филиалов (даже если они будут, что вряд ли :) ) получат свой
> префикс вот и все.

Т. о., количество ваших филиалов ограничено 100. Так и был задумано? Т. е. 101-й не появится ни при каких обстоятельствах?

> (5000 записей в день) - этого хватит надолго

Что мешает этой нагрузке измениться?
...
Рейтинг: 0 / 0
Выбор PK
    #33221055
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621Что мешает этой нагрузке измениться?
Что, впрочем, не вызовет никаких проблем. Из общих соображений я предпочитаю конструкцию

Код: plaintext
create sequence S start with <номер_филиала> increment by  1000 

- она более независима, а магическую константу 1000 обычно не составляет проблемы подобрать так, чтобы она была труднодостижима. Нагрузка может измениться на порядок-другой, а вот с филиалами это маловероятно :)

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

Код: plaintext
1.
2.
SQL> select sequence_owner, sequence_name
   2   from dba_sequences
   3   where cycle_flag = 'Y' and max_value - last_number < :N

и сообщать админу о том, что скоро потребуется выделить новый диапазон.
...
Рейтинг: 0 / 0
Выбор PK
    #33222135
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> она более независима

Это иллюзия.

> магическую константу

Плохо это - использовать такие константы. Мало того, что теоретически коряво, еще и практически не нужно.

> Нагрузка может измениться на порядок-другой, а вот с филиалами это маловероятно

Нагрузка может измениться как угодно. Сделали приложение более функциональным - она и выросла. А что имеем вместо полноценного int4? И зачем?

Кстати, если какой-нибудь местнофилиальный умелец вместо <номер_филиала> определит в sequence <номер_филиала>+n = <номер_другого_филиала>, - не страшно потом это разгребать?

> нужно только повесить job, который будет выполнять

Т. е. костыли нужно снабдить подпорками?
...
Рейтинг: 0 / 0
Выбор PK
    #33222652
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621 Т. е. костыли нужно снабдить подпорками?аффтар жжодЪ! пеши етсчо
...
Рейтинг: 0 / 0
Выбор PK
    #33222772
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621Это иллюзия.
Другого я бы попросил развеять ее. Но учитывая, в какое количество бессмысленного трепа выливается такая просьба в Вашем случае, воздержусь.
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор PK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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