Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33217876&tid=1545720]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
7ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 324ms |

| 0 / 0 |
