powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Смысл первичного ключа
25 сообщений из 80, страница 2 из 4
Смысл первичного ключа
    #38394061
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegaelsoftwarer,

В MSSQL блокировки schema modification не совместимы ни с какими другими, насколько я помню. Т.е. все писатели, а это 95% пользователей, выстроились бы в очередь, пока я не закончу.

А зачем нужно всю операцию делать в одной транзакции?
Добавление в таблицу поля и выставленние default для него не займут много времени, а обновление не потребует блокировки schema modification
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394062
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelВ MSSQL блокировки schema modification не совместимы ни с какими другими, насколько я помню.
А какие операции в описанном сценарии вызовут такие блокировки надолго? Конечно, в каждом сервере есть местная специфика, и правильный скрипт, наверное, будет выглядеть несколько иначе, но в целом я почти уверен в существовании подобного верного пути.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394217
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, Кот Матроскин,

Я не знаю, как в 2012 с сиквенсами, что с ними можно делать, а что нельзя. На тот момент это был 2005, там их не было, и в нем это выглядело бы так:

1. Атрибут identity нельзя выставить у существующего столбца, только через drop column / add (ни в какой версии нельзя, на самом деле). Это значит, что столбец придется сразу создавать как not null identity, иначе нумерация пойдет непонятно как (с новых записей? а старые останутся непронумерованными? и ловить потом эти дырки, стараясь избежать конфликтов уникальности?)
2. Вставка чего угодно not null приведет к тому, что практ. все страницы таблицы попадают на page split - в них надо добавить данные, а места уже нет. Если в табличке хотя бы 100М записей, на этом месте все очень конкретно подождут.
3. Инкремент не имеет смысла делать как просто столбец или некластерный индекс, он же монотонно возрастающий. При создании же кластерника все остальные индексы ребилдятся, у них заменяется RID на значение кластерного индекса. Тут, понятно, лучше малой кровью - сначала дропнуть все индексы, потом в конце их пересоздать. Но они же там не просто так, их кто-то использует.

Вкратце - лучше сразу проектировать правильно.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394223
TempUserDub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir
Я верно понял, что в случае, если 4 указанных столбца объявлены первичным ключом, то при добавлении строки с аналогичным набором информации - появится ошибка, но если изменить хотя бы одно значение, то строка добавится? Таким образом, уникальной является комбинация из 4-х столбцов, каждый из которых, в отдельности, может быть не уникальным, за исключением указанных?

И еще, если нам необходим один уникальный столбец без свзяи с другими таблицами, то мы можем использовать и уникальный ключ и первичнй ключ? А если несколько, то либо каждому отдельно присваивать уникальный ключ, либо сразу назначить группу столбцов первичным ключом?

В определении говорится о том, что первичный ключ позволяет быстро получить неободимую строку. Подскажите, пожалуйста, где это применяется, как её быстро получить кроме обычного указания Select * From Table Where <уникальный столбец> = <значение в уникальном столбце> ? Если приведенный способ единственный - в чем его преимущество перед обычной выборкой\обычном получении строки?

MasterZiv
Язык Java

guest_20040621
Благодарю за отличный пример.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394226
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.1)да
1.2)да
2.1)выше уже ведь отметили , что первичный ключ - один из множества уникальных, который по неким понятным вам причинам (в т.ч. и от балды) выбран "главным"
2.2)почему "либо"? это разные, но не взаимоисключающие действия
3)"определение" в студию
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394252
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael1. Атрибут identity нельзя выставить у существующего столбца
Тогда понятно, спасибо.

ЗЫ. Вот поэтому я и не люблю всякие особые сущности.. хлопот с ними..
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394473
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael1. Атрибут identity нельзя выставить у существующего столбца, только через drop column / add (ни в какой версии нельзя, на самом деле). Это значит, что столбец придется сразу создавать как not null identity, иначе нумерация пойдет непонятно как (с новых записей? а старые останутся непронумерованными? и ловить потом эти дырки, стараясь избежать конфликтов уникальности?)
2. Вставка чего угодно not null приведет к тому, что практ. все страницы таблицы попадают на page split - в них надо добавить данные, а места уже нет. Если в табличке хотя бы 100М записей, на этом месте все очень конкретно подождут.

А почему бы не сделать через копирование и drop/переименование (благо констрейнтов все равно нет)? Некоторое время табличка будет недоступна - но вряд ли больше секунды.

Ennor Tiegael3. Инкремент не имеет смысла делать как просто столбец или некластерный индекс, он же монотонно возрастающий. При создании же кластерника все остальные индексы ребилдятся, у них заменяется RID на значение кластерного индекса. Тут, понятно, лучше малой кровью - сначала дропнуть все индексы, потом в конце их пересоздать. Но они же там не просто так, их кто-то использует.


А что, до PK табличка была кучей? Ну тогда большой беды не будет, если она так и останется :)
Вопрос кластерного индекса, мне кажется, все-таки параллелен PK.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394505
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин А почему бы не сделать через копирование и drop/переименование
А что делать с записями, попавшими в табличку после копирования? Особенно в условиях отсутствия ключа?
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394541
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerКот Матроскин А почему бы не сделать через копирование и drop/переименование
А что делать с записями, попавшими в табличку после копирования? Особенно в условиях отсутствия ключа?

"Отсутствие ПК" <> "возможность полностью одинаковых кортежей", все-таки.
Копируем данные из таблицы один раз, потом блокируем ее и копируем отсутствующие (см. выше) второй раз (Сколько их там набежит за время "большого" копирования?)

А если возможны кортежи с полностью одинаковыми "смысловыми" полями - так это в любом случае попадалово, что с суррогатом, что без.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394545
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин"Отсутствие ПК" <> "возможность полностью одинаковых кортежей", все-таки
Зато изрядно похоже на "поиск одинаковых записей долог и труден".

Кот Матроскин(Сколько их там набежит за время "большого" копирования?)
Может довольно изрядно. Во всяком случае, блокировать всю деятельность на время поиска разницы может быть.... очень неприятно.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394563
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerКот Матроскин"Отсутствие ПК" <> "возможность полностью одинаковых кортежей", все-таки
Зато изрядно похоже на "поиск одинаковых записей долог и труден".
.
Не верю в возможность таблицы хотя бы с 10 атрибутами без необходимости в первичном ключе. Сравнить 10 полей (пара самых селективных из которых будет в индексе) - долго и трудно?

Кот Матроскин(Сколько их там набежит за время "большого" копирования?)
Может довольно изрядно.[/quot]
Каковы Ваши оценки "плохого случая"? Сколько у нас записей всего, сколько получаем в сутки, сколько продлится "большое" копирование, сколько займет поиск "новеньких" ( возникших за время оного копирования)?
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38394612
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TempUserDub,

MasterZiv
Язык Java


Первичный ключь — это аналог адреса объекта в java, это ссылка на объект, без которой объект будет просто недоступен.

Если из таблицы убрать первичный ключь, и все записи будут одинаковыми, то ты ничего не сможешь сделать с этими записями по-отдельности, можно будет только что-то сделать со всеми ими вместе.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395069
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerEnnor TiegaelМне, например, однажды довелось прикручивать дочку к операциям первичного учета. Если бы изначально не было суррогатного PK, даунтайм был бы адский.
Мм... а из-за чего, собственно?

Код: sql
1.
2.
3.
4.
5.
6.
7.
create sequence S start with 1000000000000;
alter table T add id integer;
alter table T modify id default S.nextval;
update T set id = rownum where id is null;
alter table T modify id not null;
create index I on T(id);
alter table T add primary key;



Вроде бы ничего из этого не требует адских мук. Ну только update может потребоваться проводить порциями с промежуточными коммитами.
Когда будешь делать alter table T modify id not null - получишь в этот самый момент полное перестроение практически всей таблицы.
Это факт проверенный опытом.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395133
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durak Когда будешь делать alter table T modify id not null - получишь в этот самый момент полное перестроение практически всей таблицы. Это факт проверенный опытом.
Сочувствую. Чего только в мире не бывает. К счастью, у меня не столь печальный опыт. Максимум, может стоит добавить novalidate, чтобы сервер не тратил время на бесполезную проверку.

А из-за чего так? Для чего полностью перестраивать всю таблицу ради одного-единственного constraint-а?
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395202
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerIvan Durak Когда будешь делать alter table T modify id not null - получишь в этот самый момент полное перестроение практически всей таблицы. Это факт проверенный опытом.
Сочувствую. Чего только в мире не бывает. К счастью, у меня не столь печальный опыт. Максимум, может стоит добавить novalidate, чтобы сервер не тратил время на бесполезную проверку.

А из-за чего так? Для чего полностью перестраивать всю таблицу ради одного-единственного constraint-а?
http://dba.stackexchange.com/questions/29522/why-does-alter-column-to-not-null-cause-massive-log-file-growth
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395327
TempUserDub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir
Первичный ключ - уникальный столбец (или их группа), используемый для идентификации каждой строки <...>.

Таким образом, первичный ключ, согласно определению, можно использовать для идентификации каждой строки и, соответсвенно, более быстрого к ней доступа.

MasterZiv
Мы можем в таблицу добавить строку без всяких ключей и затем получить её при помощи команды Select * from Table where <имя столбца> = <необходимое значение>. В итоге, объект доступен.

Если рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа?
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395328
TempUserDub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir
Первичный ключ - уникальный столбец (или их группа), используемый для идентификации каждой строки <...>.

Таким образом, первичный ключ, согласно определению, можно использовать для идентификации каждой строки и, соответсвенно, более быстрого к ней доступа.

MasterZiv
Мы можем в таблицу добавить строку без всяких ключей и затем получить её при помощи команды Select * from Table where <имя столбца> = <необходимое значение>. В итоге, объект доступен.

Если рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа?
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395333
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TempUserDubЕсли рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа?
Это бессмысленный вопрос. Первичный ключ - это просто "один из уникальных ключей".
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395335
TempUserDub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Все больше склоняюсь к тому, что первичный ключ - это просто уникальный ключ с возможностью моделировать связь между сущностями.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395337
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин Не верю в возможность таблицы хотя бы с 10 атрибутами без необходимости в первичном ключе.
Одно никак не связано с другим. Ключ нужен, когда нужно выбрать конкретную запись, количество атрибутов тут не при чём.

Сравнить 10 полей (пара самых селективных из которых будет в индексе) - долго и трудно?
Именно так. Когда часть этих полей null-овские, выражение сравнения рискует оказаться написанным с ошибками. А что касается в индексе - это, скорее, минус. Поскольку после сравнения полей "из индекса" потребуется одноблочным чтением лезть в таблицу за остальными, и хорошо ещё если clustering factor не заставит читать одно и то же по двадцать раз.

Кот МатроскинКаковы Ваши оценки "плохого случая"? Сколько у нас записей всего, сколько получаем в сутки, сколько продлится "большое" копирование, сколько займет поиск "новеньких" ( возникших за время оного копирования)?
Сколько получаем в сутки малокритично - это определяет только количесто требуемых вставок, время будет относительно небольшим. А вот сколько записей, какое оборудование, какая загрузка - это уже в меру фантазии. Но факт в том, что если при наличии ПК сравнение пройдёт простым и мелким MINUS по индексу, а там останется выгрести сравнительно небольшое количество записей, то сравнение полных таблиц будет либо MINUS full table scan-ов в памяти, либо дикое количество одноблочных чтений; то и другое - совсем другой коленкор.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395339
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TempUserDubВсе больше склоняюсь к тому, что первичный ключ - это просто уникальный ключ с возможностью моделировать связь между сущностями.
Первичный ключ - это просто уникальный ключ. Последних слов не понял, но есть подозрение, что Вы почему-то считаете, что для foreign key нужен PK.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395372
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TempUserDubТаким образом, первичный ключ, согласно определению, можно использовать для идентификации каждой строки и, соответсвенно, более быстрого к ней доступа.Вам уже много раз повторили, что он нужен только для однозначной идентификации строки(записи, сущности, ...). Скорость доступа не имеет к этому никакого отношения. Не надо больше ничего своего изобретать.

TempUserDubЕсли рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа?Формально, любой уникальный ключ может быть первичным, в теории между ними нет больше никаких различий.
Выбор одного из них в качестве первичного произволен и на практике диктуется некоторыми дополнительными, практическими же, соображениями, например, минимальностью общего размера или минимальным количеством атрибутов в составе.

При реализации во многих РСУБД дали возможность создавать уникальные ключи, любой атрибут которого или даже все могуть быть NULL. Несколько сомнительное решение имеющее в разных РСУБД разный смысл из-за разной же интерпретации NULL, что приводит к недоразумениям при миграции баз данных между разными платформами. Если же ни один атрибут уникального ключа не может быть NULL и это указано на уровне механизма ограничений РСУБД(NOT NULL), то никакой разницы между таким уникальным и основным ключами не существует. Если задан подобный уникальный ключ, то он же может быть объявлен основым, если такого не существует. На практике, можно не задавать ограничения типа PRIMARY KEY, если существует уникальный(е) ключ(и), позволяющие однозначно идентифицировать каждую строку, но это нередко воспринимается как дурной тон.

До тех пор пока в таблице явно не задан первичный(или уникальный, позволяющий однозначно идентифицировать строку(запись, сущность, ...) нет никакой гарантии, что в таблице не окажутся абсолютно одинаковые кортежи. IMHO, возможность создавать в РСУБД таблицы без явного указания способа идентификации строки(первичного или уникального(NOT NULL) ключей), является "медвежьей" услугой со стороны производителей и является потенциальным источником проблем.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395388
TempUserDub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA
Спасибо за комментарийю

Подскажите, пожалуйста, имея первичный ключ можно ли как-то быстрее\более коротким способом получить строку, чем при помощи команды Select * from Table where <имя столбца> = <необходимое значение> ?

Пример - в Java в двумерном массиве можно искать необходимый элемент при помощи перебора каждой строки\ячейки. Тем не менее, если мы точно знаем какой нам нужен элемент, то мы можем сразу его получить, указав номер строки и столбца, например, Array[2][3]. В SQL вариант с командой Select, приведенной выше, более напоминает перебор массива.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395397
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TempUserDubПодскажите, пожалуйста, имея первичный ключ можно ли как-то быстрее\более коротким способом получить строку, чем при помощи команды Select * from Table where <имя столбца> = <необходимое значение> ?Скорость получения данных теоретически не зависит от существования первичного ключа. На практике же, она зависит только от наличия "правильных" индексов. Первичный ключ обычно реализуется с помощью уникального индекса.

TempUserDubПример - в Java в двумерном массиве можно искать необходимый элемент при помощи перебора каждой строки\ячейки. Тем не менее, если мы точно знаем какой нам нужен элемент, то мы можем сразу его получить, указав номер строки и столбца, например, Array[2][3]. В SQL вариант с командой Select, приведенной выше, более напоминает перебор массива.Как раз нет никакого перебора, SQL - декларативный язык. Вы просто указываете, по каким условиям вам нужно получить строки. РСУБД сам определяет каким способом он будет его выполнять. В частном случае, это может быть простое сканирование, т.е., перебор всех строк, пока не будут найдены все, удовлетворяющие заданным условиям. В то же время если есть "удачные" индексы, то поиск может начатся с них и только потом из таблицы будут выбираться данные, по ссылкам, полученным из индекса. Более подробно про индексы и способы доступа к данным лучше читать в учебниках или руководствах по конкретным РСУБД.

P.S. У вас какие-то свои представления о том, что из себя представляют БД. Здесь редко отвечают на подобные вопросы, обычно сразу посылают в сад почитать какой-нибудь учебник по БД, так что вам ещё сильно повезло. Хотя не удивлюсь, если вас скоро с такими вопросами таки начнут посылать.
...
Рейтинг: 0 / 0
Смысл первичного ключа
    #38395405
TempUserDub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA
Данный вопрос о предназначении первичного ключа и отличии от уникально достатончо часто встречает в интернете, н о нигде нет точного ответа Я искренне благодарен всем пользователям, учавствующим в данном обсуждении.

Главное отличие уникальное ключа от первичного, помимо допустимости NULL - уникальных ключей может быть много, а первичный - один.
Внешний ключ может ссылаться и на первичный, и на уникальный ключ.

В итоге, учитывая, что функции первичного ключа дублируются уникальным - для чего первчиному ключу делать ограничение на количество ключей? Мы можем внешнему ключу назначить ссылку на уникальный и получим аналогичный результат.

Мне необходимо понять этот вопрос, чтобы двигаться далее в изучении БД и SQL)
...
Рейтинг: 0 / 0
25 сообщений из 80, страница 2 из 4
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Смысл первичного ключа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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