Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
С поиском на скуле снова туговато, поэтому не бейте, если вопрос уже задавали. Мимоходом слышал, о том что выбор identity field в качестве PK - кривое решение. Хочется узнать почему? К примеру у нас имеется несколько областных серверов и один центральный. У каждого из серверов PK - это identity с определенной областью значений, которая не перекрывается PK других серверов. Кроме PK конечно же есть ещё и unique key. Все областные сервера реплицируются на центральный сервер. Манипулировать, настраивать репликацию и пр. пр., по-моему легче с PK из одного поля, чем составным. В чем же тогда цимус? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 10:15 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
>> Манипулировать, настраивать репликацию и пр. пр., по-моему легче с PK из одного поля, чем составным. Это почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 10:51 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanЭто почему? :) Берём просто манипуляцию (при репликации я получаю горизонтальные и вертикальные сабсеты, поэтому репликацию сюда сунул). ведь куда проще написать: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. Не могу найти, кто говорил про минусы identity as PK пока поиск не работает. Просто сейчас стало интересно - почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 10:58 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
ГостиМимоходом слышал, о том что выбор identity field в качестве PK - кривое решение. Хочется узнать почему? Возможно я не понимаю, что такое identity field, но если не ошибаюсь, его для этого и придумывали. Соответственно, такое утверждение эквивалентно утверждению "identity не должны использоваться". На аргументацию этого утверждения и мне хотелось бы полюбоваться. Единственный вариант, который я вижу - недобитый фанатик естественных ключей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:17 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
identity - автоинкрементное поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:24 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
Ну хорошо, положим что у вас единственное поле в ПК, причем разбито по диапозонам для филиалов. И пусть все ложится в консолидированную базу. И, пожалуйста нарисуйте мне запрос сгруппируйте все по филиалам. Или положим в каком-то филиале грохнулась база. Сделайте экстракт данных для этого филиала из консолидированной. И, путь допустим диапазон по какой-либо причине перекрылся (мало ли какая ошибка) что делать в этом случае? Я не говорю что все это сделать невозможно. Пусть каждый живет с тем геморроем который ему нравится. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:30 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
Гости gardenmanЭто почему? :) Берём просто манипуляцию (при репликации я получаю горизонтальные и вертикальные сабсеты, поэтому репликацию сюда сунул). ведь куда проще написать: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. в постгресе работает конструкция 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:32 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторНу хорошо, положим что у вас единственное поле в ПК, причем разбито по диапозонам для филиалов. И пусть все ложится в консолидированную базу. И, пожалуйста нарисуйте мне запрос сгруппируйте все по филиалам. Или положим в каком-то филиале грохнулась база. Сделайте экстракт данных для этого филиала из консолидированной. И, путь допустим диапазон по какой-либо причине перекрылся (мало ли какая ошибка) что делать в этом случае? Я не говорю что все это сделать невозможно. Пусть каждый живет с тем геморроем который ему нравится. Удачи. что за? объясните по порядку, чем здесь составной ключ будет лучше не составного и с чего такой тон? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:35 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
Гости чем здесь составной ключ будет лучше не составного и с чего такой тон? ключ(ид_филиала, ид_чегохошь) свободен от необходимости расщеплять поле, и от возможности наложения интервалов ("паашибке"). А т.к. это оказалось непонятным - то видимо и тон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:38 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
Ага, а теперь сравним эти запросы по производительности с простым select * from table where filial=..., причем поле filial первое поле первичного ключа.))) Я соглашусь, что можно такую фигню использовать если в табличке несколько тысяч записей. А если несколько миллионов? Интересно на какую производительность вы расчитываете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:38 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
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 злом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:42 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
зы. я не являюсь ярым сторонником того или другого метода. Мне интересно почему кое-кто считает identity злом? Зло не identity, а неразумное его его использование повсюду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:46 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanАга, а теперь сравним эти запросы по производительности с простым select * from table where filial=..., причем поле filial первое поле первичного ключа.))) Я соглашусь, что можно такую фигню использовать если в табличке несколько тысяч записей. А если несколько миллионов? Интересно на какую производительность вы расчитываете? и что? кроме первичного ключа в виде identity - обязательно есть альтернативный ключ. пусть filial будет "первым полем альтернативного ключа" - что изменится в производительности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:49 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
А зачем нужно два индекса, если можно обойтись одним? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 11:57 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторА зачем нужно два индекса, если можно обойтись одним? для вот этого к примеру: Код: plaintext 1. 2. Код: plaintext 1. 2. altkey - alternative key pk - primary key fk - foreign key надо будет кстати протестировать подобное, что быстрее: поиск по индексу составного альтернативного ключа + поиск по уникальному не составному индексу или поиск по индексу составного внешнего ключа + поиск по составному уникальному индексу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 12:07 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
А почему это вы решили что у вас в системе будет только поиск по индексу ? Намекаете на INDEX ORING/ANDING? Думаете это простые операции? А insert, update, delete? Вы попробуйте куда будут вставляться быстрее записи - в табличку где один индекс или два? Если табличка у вас - просто справочник который обновляется пару раз в день, то конечно можно нарисовать пару десятков индексов. А если это не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 12:13 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторА почему это вы решили что у вас в системе будет только поиск по индексу? Намекаете на INDEX ORING/ANDING? Думаете это простые операции? А insert, update, delete? Вы попробуйте куда будут вставляться быстрее записи - в табличку где один индекс или два? Если табличка у вас - просто справочник который обновляется пару раз в день, то конечно можно нарисовать пару десятков индексов. А если это не так? ок. Для OLTP - схема действительно не самая подходящая. Ура, наконец то что то есть. А вот по поводу поиска только/не только по индексу: причем здесь это? при table scan и пр. неиндексиронном поиске как будет влиять структура ключа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 12:21 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanИ, пожалуйста нарисуйте мне запрос сгруппируйте все по филиалам. Код: plaintext gardenmanИли положим в каком-то филиале грохнулась база. Сделайте экстракт данных для этого филиала из консолидированной. Ээ.. надо писать? Хотя в первую очередь надо не экстракт делать, а админа увольнять, у которого в мирное время невосстановимо грохается база. gardenmanИ, путь допустим диапазон по какой-либо причине перекрылся (мало ли какая ошибка) что делать в этом случае? Писать прокламацию производителю СУБД. Примерно так - я, мол, делаю Код: plaintext а он, сволочь, полез в чужой диапазон. gardenmanЯ не говорю что все это сделать невозможно. Пусть каждый живет с тем геморроем который ему нравится. Вот уж точно. Я правильно понимаю, что для Вас group by division_id - аргумент за составной ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 12:24 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторНамекаете на INDEX ORING/ANDING? Думаете это простые операции? INDEX ORING/ANDING в вышеприведенном примере с запросами как то имеет значение? Запросы со стороны кол-ва индексов и ORING/ANDING равноправны имхо. черт с ними это частный случай. Сейчас подумаю, где ORING/ANDING для identity и составного будут в пользу того или другого... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 12:30 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanА зачем нужно два индекса, если можно обойтись одним? Можно обойтись и вообще без индексов. Вопрос в том, нужно ли. Вопрос "что есть оптимально", как мы все догадываемся, вряд ли имеет конкретный и одновременно универсальный ответ. Например, пара индексов PK:(id_field), INDEX:(division, field_a, field_b, field_c) запросто может оказаться предпочтительнее, нежели пара индексов PK:(division, field_a), INDEX:(division, ....) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 12:31 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
softwarer Я правильно понимаю, что для Вас group by division_id - аргумент за составной ключ? нет, аргумент тут скорее редкая, но таки возможная ситуация, когда базы ставились как заведомо независимые (т.е. никто не написал заранее разных минимумов и максимумов на диапазоны), а потом таки оказалось, что данные надо слить. Кажется таки отапдейтить ид_дивижна проще, чем сдвинуть счетчик (некоторые субд к тому же проверяют уникью на каждую запись, а не на стейтмент - придеца делать апдейт на ОрдернутуюБайДеск таблицу - лишние слова в пестне, однако). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:10 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
ЗЫ. кстати мой вариант ключа такой: (ид_филиал, счетчик), а не десять полей. Но это скорее от привычки иметь дело с базами (в филиалах), где изначально нет ни ай-ди_филиал, ни выделенных диапазонов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:14 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
Можно обойтись и вообще без индексов. Вопрос в том, нужно ли. Ну если проектировать базу так как вы советуете, то в конце концов как раз так и получится, что система не будет использовать индексы несмотря на то, что они есть. Я правильно понимаю, что для Вас 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). Соответственно и подходы диктуются используемым сервером БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:26 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
4321нет, аргумент тут скорее редкая, но таки возможная ситуация, когда базы ставились как заведомо независимые (т.е. никто не написал заранее разных минимумов и максимумов на диапазоны), а потом таки оказалось, что данные надо слить. Кажется таки отапдейтить ид_дивижна проще, чем сдвинуть счетчик Первое, что в этом случае придется делать - ВВОДИТЬ ид_дивижна, поскольку в "заведомо независимых" базах его не будет. Второе - переписывать все селекты, которые про ид_дивижна знать ничего не знают (в данном случае я предполагаю, что авторы СУБД не настолько законченные идиоты, чтобы пользоваться NATURAL JOIN или аналогичными неявными конструкциями). Ну и само собой, потребуется решить еще кучу неприятных вопросов - согласование справочников, сведение данных, изменения задним числом... В общем, я бы сказал, это практически в любом случае настолько неприятная процедура, что лучше не давать ей шанса на жизнь. Наверное, можно найти случаи, когда вместо ид_дивижна можно заюзать какой-то подходящий справочник и решить задачу дешево, типа "был справочник с записями ОТДЕЛ1, ОТДЕЛ2, стал справочник с записями ФИЛИАЛ1_ОТДЕЛ1, ФИЛИАЛ1_ОТДЕЛ2", но это вряд ли часто возможно и это совершенно точно не очень-то хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:32 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
Преписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать. ALTER TABLE - может и придется сделать а вот переписывать селекты - зачем? А если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:36 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
Сделайте так: В пределах одного филиала ключ интовый идентити, а в в межфилиальном пространстве uniqueidentifier соответствующий интовому. И будет Вам счастье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:48 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторИ вообще сыр-бор как я понимаю только из-за того, что кто-то очень хочет писать 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 и проч? или всё таки удобство? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:51 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanПреписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать. Давайте смотреть. Две таблицы, СОТРУДНИКИ и ЗАРПЛАТЫ. Сделали alter table, добавили в каждую поле "филиал". Выполняем запрос: Код: plaintext 1. Внимание, вопрос: куда меня пошлет бухгалтер, когда я потребую у него все приписанные мне зарплаты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 13:51 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
А вопросик можно? Вы в какой базе этот запрос делаете? В базе филиала или в консолидированной базе? Если в базе филиала - то никаких проблем. А если в консолидированной - это ее проблемы :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 14:00 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторА вопросик можно? Вы в какой базе этот запрос делаете? В базе филиала или в консолидированной базе? Если в базе филиала - то никаких проблем. А если в консолидированной - это ее проблемы :)) а какие могут быть проблемы в консолидированной? Селективность у уникального индекса куда как очень хорошая. Так ведь? Или о чем вы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 14:04 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
2 Гости На счет AS/400 не знаю. Знаю на счет DB2UDB - на самом деле там IDENTITY нет. Есть только SQUENCE. Для каждого поля IDENTITY неявно создается свой SEQUENCE. Это все видно в представлениях каталога. А написать свою функцию на C, которая раздавала бы IDENTITY ничего не стоит. Было бы желание. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 14:04 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanА если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто... Если - как предложил мой собеседник - задача стартует с "независимо установленных систем", в ней на 100% будут коллизии в id-шниках. Если диапазоны изначально удерживаются различными - собственно, имеем вполне нормальную ситуацию с identity, нет никаких причин делать составной ключ. Почему нет? Давайте ограничимся индексами. Итак, изначально есть индекс PK:(table_id) С введением понятия филиала добавляются потенциальные индексы: AK:(table_id, division_id) AK:(division_id, table_id) Первый из них почти бессмысленен, хорош только тем, что запрос вида Код: plaintext выполнится несколько быстрее. Второй - вообще бессмысленен за исключением разве что некоторых order by-ев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 14:07 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanА если в консолидированной - это ее проблемы Тогда не понимаю, почему Вы сами не ответили на собственный вопрос "как в таком случае сделать группировку по филиалам". Ровно этими же словами. Правда, если мне доведется заказывать софт на стороне, я предпочту исполнителя, не имеющего привычки отвечать "это ваши проблемы". Нехай он сидит со своими составными ключами, а я куплю работающую систему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 14:11 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
> У каждого из серверов PK - это identity с определенной областью > значений, которая не перекрывается PK других серверов. Откуда уверенность, что они не перекрываются? Каковы правила раздачи диапазонов? Каковый правила выделения диапазонов при добавлении серверов? Каковы правила выделения диапазонов при необходимости деления филиалов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 14:38 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторОткуда уверенность, что они не перекрываются? Каковы правила раздачи диапазонов? Каковый правила выделения диапазонов при добавлении серверов? Каковы правила выделения диапазонов при необходимости деления филиалов? а это что за подозрения такие и как они относятся к теме дискуссии? Посмотрите, хотя бы пример софтварера - есть сомнения, что значения выйдут за диапазон? Я тоже уверен, что у нас они всегда будут уникальны для всей системы в целом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 16:04 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
> а это что за подозрения такие и как они относятся к теме дискуссии? Я читаю первое (Ваше) сообщение этого треда. Вижу описание примера, которое на мой взгляд, является типично кривым. Т. е. "выбор identity field в качестве PK - кривое решение" - ответ нет. А вот Ваш пример - это пример кривого решения. Отсюда и вопросы. > Посмотрите, хотя бы пример софтварера - есть сомнения, что значения > выйдут за диапазон? Чего пример, простите? Что мне этот пример должен объяснить? > Я тоже уверен, что у нас они всегда будут уникальны для всей > системы в целом. Я и прошу поделиться Вашей уверенностью. На чем-то ведь она основана, правда? Вопросы - сообщением выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 16:26 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторЯ читаю первое (Ваше) сообщение этого треда. Вижу описание примера, которое на мой взгляд, является типично кривым. Т. е. "выбор identity field в качестве PK - кривое решение" - ответ нет. А вот Ваш пример - это пример кривого решения. Отсюда и вопросы. identitiy генерится через одну таблицу, затем префиксуется/постфиксуется условным кодом области, полученное id используется в кач-ве первичного ключа в остальных документах БД. Это решение сильно кривое? авторЧего пример, простите? Что мне этот пример должен объяснить? softwarercreate sequence S minvalue 1000 maxvalue 2000 - эта конструкция достаточно однозначна - значения не выходят за диапазон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 16:34 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
> Это решение сильно кривое? Смотря с чем сравнивать. > identitiy генерится через одну таблицу, затем префиксуется/постфиксуется > условным кодом области, полученное id используется в кач-ве первичного ключа > в остальных документах БД. Т. е. условный код добавляется в начало первичного ключа и в конец (префикс + id + суффикс; префикс = суффиксу), так? Каков размер первичного ключа? Что Вы собираетесь делать при необходимости описывать филиалы филиалов? > create sequence S minvalue 1000 maxvalue 2000 - эта конструкция достаточно > однозначна - значения не выходят за диапазон. Это понятно. А почему Вы считаете, что заявленного диапазона Вам должно хватить (причем, в сильно урезанном виде из-за алгоритма формирования первичного ключа)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 16:53 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
авторСмотря с чем сравнивать. а че его сравнивать, для задачи, которая у нас есть - это было самым оптимальным решением. авторТ. е. условный код добавляется в начало первичного ключа и в конец (префикс + id + суффикс; префикс = суффиксу), так? Каков размер первичного ключа? Что Вы собираетесь делать при необходимости описывать филиалы филиалов? префикс ИЛИ суффикс - у нас префикс. Некоторые делают суффикс - это не имеет значения. размер первичного ключа - integer+2 символа префикса. филиалы филиалов (даже если они будут, что вряд ли :) ) получат свой префикс вот и все. авторЭто понятно. А почему Вы считаете, что заявленного диапазона Вам должно хватить (причем, в сильно урезанном виде из-за алгоритма формирования первичного ключа)? в нашем случае диапазон иссякнет не очень скоро. сколько там под интегер отведено? кажется 4 байта, + 2 байта префикс даже при нынешней нагрузке (5000 записей в день) - этого хватит надолго ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 17:13 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
gardenmanПреписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать. ALTER TABLE - может и придется сделать а вот переписывать селекты - зачем? А если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто... Можно ввести корпоративный Identity и пусть филиалы при помощи него между собой и "старшим братом" сношаются ЗЫ Филиалы его(corpo_identity) почитывают, а старший брат пописывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 17:20 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
И вообще, на каждом уровне должен быть свой, самостоятельный(для уровня) identity ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 17:24 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
> для задачи, которая у нас есть - это было самым оптимальным решением. Если Вы говорите "оптимальным", было бы правильно приводить при этом критерии оптимальности. Абстрактно оптимальных решений не бывает. > размер первичного ключа - integer+2 символа префикса. А храните Вы его как? В виде текста? > филиалы филиалов (даже если они будут, что вряд ли :) ) получат свой > префикс вот и все. Т. о., количество ваших филиалов ограничено 100. Так и был задумано? Т. е. 101-й не появится ни при каких обстоятельствах? > (5000 записей в день) - этого хватит надолго Что мешает этой нагрузке измениться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 18:09 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
guest_20040621Что мешает этой нагрузке измениться? Что, впрочем, не вызовет никаких проблем. Из общих соображений я предпочитаю конструкцию Код: plaintext - она более независима, а магическую константу 1000 обычно не составляет проблемы подобрать так, чтобы она была труднодостижима. Нагрузка может измениться на порядок-другой, а вот с филиалами это маловероятно :) Тем не менее, и с указанной конструкцией особых проблем нет - нужно только повесить job, который будет выполнять Код: plaintext 1. 2. и сообщать админу о том, что скоро потребуется выделить новый диапазон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2005, 16:04 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
> она более независима Это иллюзия. > магическую константу Плохо это - использовать такие константы. Мало того, что теоретически коряво, еще и практически не нужно. > Нагрузка может измениться на порядок-другой, а вот с филиалами это маловероятно Нагрузка может измениться как угодно. Сделали приложение более функциональным - она и выросла. А что имеем вместо полноценного int4? И зачем? Кстати, если какой-нибудь местнофилиальный умелец вместо <номер_филиала> определит в sequence <номер_филиала>+n = <номер_другого_филиала>, - не страшно потом это разгребать? > нужно только повесить job, который будет выполнять Т. е. костыли нужно снабдить подпорками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 09:04 |
|
||
|
Выбор PK
|
|||
|---|---|---|---|
|
#18+
guest_20040621 Т. е. костыли нужно снабдить подпорками?аффтар жжодЪ! пеши етсчо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2005, 11:58 |
|
||
|
|

start [/forum/search_topic.php?author=CMP&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 659ms |
| total: | 806ms |

| 0 / 0 |
