|
|
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Ennor Tiegaelsoftwarer, В MSSQL блокировки schema modification не совместимы ни с какими другими, насколько я помню. Т.е. все писатели, а это 95% пользователей, выстроились бы в очередь, пока я не закончу. А зачем нужно всю операцию делать в одной транзакции? Добавление в таблицу поля и выставленние default для него не займут много времени, а обновление не потребует блокировки schema modification ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2013, 19:04 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Ennor TiegaelВ MSSQL блокировки schema modification не совместимы ни с какими другими, насколько я помню. А какие операции в описанном сценарии вызовут такие блокировки надолго? Конечно, в каждом сервере есть местная специфика, и правильный скрипт, наверное, будет выглядеть несколько иначе, но в целом я почти уверен в существовании подобного верного пути. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2013, 19:06 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
softwarer, Кот Матроскин, Я не знаю, как в 2012 с сиквенсами, что с ними можно делать, а что нельзя. На тот момент это был 2005, там их не было, и в нем это выглядело бы так: 1. Атрибут identity нельзя выставить у существующего столбца, только через drop column / add (ни в какой версии нельзя, на самом деле). Это значит, что столбец придется сразу создавать как not null identity, иначе нумерация пойдет непонятно как (с новых записей? а старые останутся непронумерованными? и ловить потом эти дырки, стараясь избежать конфликтов уникальности?) 2. Вставка чего угодно not null приведет к тому, что практ. все страницы таблицы попадают на page split - в них надо добавить данные, а места уже нет. Если в табличке хотя бы 100М записей, на этом месте все очень конкретно подождут. 3. Инкремент не имеет смысла делать как просто столбец или некластерный индекс, он же монотонно возрастающий. При создании же кластерника все остальные индексы ребилдятся, у них заменяется RID на значение кластерного индекса. Тут, понятно, лучше малой кровью - сначала дропнуть все индексы, потом в конце их пересоздать. Но они же там не просто так, их кто-то использует. Вкратце - лучше сразу проектировать правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 03:02 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
tanglir Я верно понял, что в случае, если 4 указанных столбца объявлены первичным ключом, то при добавлении строки с аналогичным набором информации - появится ошибка, но если изменить хотя бы одно значение, то строка добавится? Таким образом, уникальной является комбинация из 4-х столбцов, каждый из которых, в отдельности, может быть не уникальным, за исключением указанных? И еще, если нам необходим один уникальный столбец без свзяи с другими таблицами, то мы можем использовать и уникальный ключ и первичнй ключ? А если несколько, то либо каждому отдельно присваивать уникальный ключ, либо сразу назначить группу столбцов первичным ключом? В определении говорится о том, что первичный ключ позволяет быстро получить неободимую строку. Подскажите, пожалуйста, где это применяется, как её быстро получить кроме обычного указания Select * From Table Where <уникальный столбец> = <значение в уникальном столбце> ? Если приведенный способ единственный - в чем его преимущество перед обычной выборкой\обычном получении строки? MasterZiv Язык Java guest_20040621 Благодарю за отличный пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 04:55 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
1.1)да 1.2)да 2.1)выше уже ведь отметили , что первичный ключ - один из множества уникальных, который по неким понятным вам причинам (в т.ч. и от балды) выбран "главным" 2.2)почему "либо"? это разные, но не взаимоисключающие действия 3)"определение" в студию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 05:32 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Ennor Tiegael1. Атрибут identity нельзя выставить у существующего столбца Тогда понятно, спасибо. ЗЫ. Вот поэтому я и не люблю всякие особые сущности.. хлопот с ними.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 08:34 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Ennor Tiegael1. Атрибут identity нельзя выставить у существующего столбца, только через drop column / add (ни в какой версии нельзя, на самом деле). Это значит, что столбец придется сразу создавать как not null identity, иначе нумерация пойдет непонятно как (с новых записей? а старые останутся непронумерованными? и ловить потом эти дырки, стараясь избежать конфликтов уникальности?) 2. Вставка чего угодно not null приведет к тому, что практ. все страницы таблицы попадают на page split - в них надо добавить данные, а места уже нет. Если в табличке хотя бы 100М записей, на этом месте все очень конкретно подождут. А почему бы не сделать через копирование и drop/переименование (благо констрейнтов все равно нет)? Некоторое время табличка будет недоступна - но вряд ли больше секунды. Ennor Tiegael3. Инкремент не имеет смысла делать как просто столбец или некластерный индекс, он же монотонно возрастающий. При создании же кластерника все остальные индексы ребилдятся, у них заменяется RID на значение кластерного индекса. Тут, понятно, лучше малой кровью - сначала дропнуть все индексы, потом в конце их пересоздать. Но они же там не просто так, их кто-то использует. А что, до PK табличка была кучей? Ну тогда большой беды не будет, если она так и останется :) Вопрос кластерного индекса, мне кажется, все-таки параллелен PK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 11:40 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин А почему бы не сделать через копирование и drop/переименование А что делать с записями, попавшими в табличку после копирования? Особенно в условиях отсутствия ключа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 11:53 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
softwarerКот Матроскин А почему бы не сделать через копирование и drop/переименование А что делать с записями, попавшими в табличку после копирования? Особенно в условиях отсутствия ключа? "Отсутствие ПК" <> "возможность полностью одинаковых кортежей", все-таки. Копируем данные из таблицы один раз, потом блокируем ее и копируем отсутствующие (см. выше) второй раз (Сколько их там набежит за время "большого" копирования?) А если возможны кортежи с полностью одинаковыми "смысловыми" полями - так это в любом случае попадалово, что с суррогатом, что без. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 12:19 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин"Отсутствие ПК" <> "возможность полностью одинаковых кортежей", все-таки Зато изрядно похоже на "поиск одинаковых записей долог и труден". Кот Матроскин(Сколько их там набежит за время "большого" копирования?) Может довольно изрядно. Во всяком случае, блокировать всю деятельность на время поиска разницы может быть.... очень неприятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 12:24 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
softwarerКот Матроскин"Отсутствие ПК" <> "возможность полностью одинаковых кортежей", все-таки Зато изрядно похоже на "поиск одинаковых записей долог и труден". . Не верю в возможность таблицы хотя бы с 10 атрибутами без необходимости в первичном ключе. Сравнить 10 полей (пара самых селективных из которых будет в индексе) - долго и трудно? Кот Матроскин(Сколько их там набежит за время "большого" копирования?) Может довольно изрядно.[/quot] Каковы Ваши оценки "плохого случая"? Сколько у нас записей всего, сколько получаем в сутки, сколько продлится "большое" копирование, сколько займет поиск "новеньких" ( возникших за время оного копирования)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 12:37 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
TempUserDub, MasterZiv Язык Java Первичный ключь — это аналог адреса объекта в java, это ссылка на объект, без которой объект будет просто недоступен. Если из таблицы убрать первичный ключь, и все записи будут одинаковыми, то ты ничего не сможешь сделать с этими записями по-отдельности, можно будет только что-то сделать со всеми ими вместе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 12:59 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
softwarerEnnor TiegaelМне, например, однажды довелось прикручивать дочку к операциям первичного учета. Если бы изначально не было суррогатного PK, даунтайм был бы адский. Мм... а из-за чего, собственно? Код: sql 1. 2. 3. 4. 5. 6. 7. Вроде бы ничего из этого не требует адских мук. Ну только update может потребоваться проводить порциями с промежуточными коммитами. Когда будешь делать alter table T modify id not null - получишь в этот самый момент полное перестроение практически всей таблицы. Это факт проверенный опытом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 17:26 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Ivan Durak Когда будешь делать alter table T modify id not null - получишь в этот самый момент полное перестроение практически всей таблицы. Это факт проверенный опытом. Сочувствую. Чего только в мире не бывает. К счастью, у меня не столь печальный опыт. Максимум, может стоит добавить novalidate, чтобы сервер не тратил время на бесполезную проверку. А из-за чего так? Для чего полностью перестраивать всю таблицу ради одного-единственного constraint-а? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 18:12 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 19:36 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
tanglir Первичный ключ - уникальный столбец (или их группа), используемый для идентификации каждой строки <...>. Таким образом, первичный ключ, согласно определению, можно использовать для идентификации каждой строки и, соответсвенно, более быстрого к ней доступа. MasterZiv Мы можем в таблицу добавить строку без всяких ключей и затем получить её при помощи команды Select * from Table where <имя столбца> = <необходимое значение>. В итоге, объект доступен. Если рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 22:42 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
tanglir Первичный ключ - уникальный столбец (или их группа), используемый для идентификации каждой строки <...>. Таким образом, первичный ключ, согласно определению, можно использовать для идентификации каждой строки и, соответсвенно, более быстрого к ней доступа. MasterZiv Мы можем в таблицу добавить строку без всяких ключей и затем получить её при помощи команды Select * from Table where <имя столбца> = <необходимое значение>. В итоге, объект доступен. Если рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 22:42 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
TempUserDubЕсли рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа? Это бессмысленный вопрос. Первичный ключ - это просто "один из уникальных ключей". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 22:50 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
softwarer Все больше склоняюсь к тому, что первичный ключ - это просто уникальный ключ с возможностью моделировать связь между сущностями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 22:57 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин Не верю в возможность таблицы хотя бы с 10 атрибутами без необходимости в первичном ключе. Одно никак не связано с другим. Ключ нужен, когда нужно выбрать конкретную запись, количество атрибутов тут не при чём. Сравнить 10 полей (пара самых селективных из которых будет в индексе) - долго и трудно? Именно так. Когда часть этих полей null-овские, выражение сравнения рискует оказаться написанным с ошибками. А что касается в индексе - это, скорее, минус. Поскольку после сравнения полей "из индекса" потребуется одноблочным чтением лезть в таблицу за остальными, и хорошо ещё если clustering factor не заставит читать одно и то же по двадцать раз. Кот МатроскинКаковы Ваши оценки "плохого случая"? Сколько у нас записей всего, сколько получаем в сутки, сколько продлится "большое" копирование, сколько займет поиск "новеньких" ( возникших за время оного копирования)? Сколько получаем в сутки малокритично - это определяет только количесто требуемых вставок, время будет относительно небольшим. А вот сколько записей, какое оборудование, какая загрузка - это уже в меру фантазии. Но факт в том, что если при наличии ПК сравнение пройдёт простым и мелким MINUS по индексу, а там останется выгрести сравнительно небольшое количество записей, то сравнение полных таблиц будет либо MINUS full table scan-ов в памяти, либо дикое количество одноблочных чтений; то и другое - совсем другой коленкор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 23:01 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
TempUserDubВсе больше склоняюсь к тому, что первичный ключ - это просто уникальный ключ с возможностью моделировать связь между сущностями. Первичный ключ - это просто уникальный ключ. Последних слов не понял, но есть подозрение, что Вы почему-то считаете, что для foreign key нужен PK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2013, 23:02 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
TempUserDubТаким образом, первичный ключ, согласно определению, можно использовать для идентификации каждой строки и, соответсвенно, более быстрого к ней доступа.Вам уже много раз повторили, что он нужен только для однозначной идентификации строки(записи, сущности, ...). Скорость доступа не имеет к этому никакого отношения. Не надо больше ничего своего изобретать. TempUserDubЕсли рассмотреть вариант, когда пользователь заполняет базу неповторяющимися данными или когда необходимые столбцы имеют уникальный ключ, то в чем преимущество первичного ключа?Формально, любой уникальный ключ может быть первичным, в теории между ними нет больше никаких различий. Выбор одного из них в качестве первичного произволен и на практике диктуется некоторыми дополнительными, практическими же, соображениями, например, минимальностью общего размера или минимальным количеством атрибутов в составе. При реализации во многих РСУБД дали возможность создавать уникальные ключи, любой атрибут которого или даже все могуть быть NULL. Несколько сомнительное решение имеющее в разных РСУБД разный смысл из-за разной же интерпретации NULL, что приводит к недоразумениям при миграции баз данных между разными платформами. Если же ни один атрибут уникального ключа не может быть NULL и это указано на уровне механизма ограничений РСУБД(NOT NULL), то никакой разницы между таким уникальным и основным ключами не существует. Если задан подобный уникальный ключ, то он же может быть объявлен основым, если такого не существует. На практике, можно не задавать ограничения типа PRIMARY KEY, если существует уникальный(е) ключ(и), позволяющие однозначно идентифицировать каждую строку, но это нередко воспринимается как дурной тон. До тех пор пока в таблице явно не задан первичный(или уникальный, позволяющий однозначно идентифицировать строку(запись, сущность, ...) нет никакой гарантии, что в таблице не окажутся абсолютно одинаковые кортежи. IMHO, возможность создавать в РСУБД таблицы без явного указания способа идентификации строки(первичного или уникального(NOT NULL) ключей), является "медвежьей" услугой со стороны производителей и является потенциальным источником проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 01:29 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
ChA Спасибо за комментарийю Подскажите, пожалуйста, имея первичный ключ можно ли как-то быстрее\более коротким способом получить строку, чем при помощи команды Select * from Table where <имя столбца> = <необходимое значение> ? Пример - в Java в двумерном массиве можно искать необходимый элемент при помощи перебора каждой строки\ячейки. Тем не менее, если мы точно знаем какой нам нужен элемент, то мы можем сразу его получить, указав номер строки и столбца, например, Array[2][3]. В SQL вариант с командой Select, приведенной выше, более напоминает перебор массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 02:24 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
TempUserDubПодскажите, пожалуйста, имея первичный ключ можно ли как-то быстрее\более коротким способом получить строку, чем при помощи команды Select * from Table where <имя столбца> = <необходимое значение> ?Скорость получения данных теоретически не зависит от существования первичного ключа. На практике же, она зависит только от наличия "правильных" индексов. Первичный ключ обычно реализуется с помощью уникального индекса. TempUserDubПример - в Java в двумерном массиве можно искать необходимый элемент при помощи перебора каждой строки\ячейки. Тем не менее, если мы точно знаем какой нам нужен элемент, то мы можем сразу его получить, указав номер строки и столбца, например, Array[2][3]. В SQL вариант с командой Select, приведенной выше, более напоминает перебор массива.Как раз нет никакого перебора, SQL - декларативный язык. Вы просто указываете, по каким условиям вам нужно получить строки. РСУБД сам определяет каким способом он будет его выполнять. В частном случае, это может быть простое сканирование, т.е., перебор всех строк, пока не будут найдены все, удовлетворяющие заданным условиям. В то же время если есть "удачные" индексы, то поиск может начатся с них и только потом из таблицы будут выбираться данные, по ссылкам, полученным из индекса. Более подробно про индексы и способы доступа к данным лучше читать в учебниках или руководствах по конкретным РСУБД. P.S. У вас какие-то свои представления о том, что из себя представляют БД. Здесь редко отвечают на подобные вопросы, обычно сразу посылают в сад почитать какой-нибудь учебник по БД, так что вам ещё сильно повезло. Хотя не удивлюсь, если вас скоро с такими вопросами таки начнут посылать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 03:06 |
|
||
|
Смысл первичного ключа
|
|||
|---|---|---|---|
|
#18+
ChA Данный вопрос о предназначении первичного ключа и отличии от уникально достатончо часто встречает в интернете, н о нигде нет точного ответа Я искренне благодарен всем пользователям, учавствующим в данном обсуждении. Главное отличие уникальное ключа от первичного, помимо допустимости NULL - уникальных ключей может быть много, а первичный - один. Внешний ключ может ссылаться и на первичный, и на уникальный ключ. В итоге, учитывая, что функции первичного ключа дублируются уникальным - для чего первчиному ключу делать ограничение на количество ключей? Мы можем внешнему ключу назначить ссылку на уникальный и получим аналогичный результат. Мне необходимо понять этот вопрос, чтобы двигаться далее в изучении БД и SQL) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 04:24 |
|
||
|
|

start [/forum/search_topic.php?author=Fant1&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
17ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 443ms |
| total: | 636ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...