|
|
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Это очень базовый вопрос, на самом деле. В моем представлении, есть естественный первичный ключ и суррогатный первичный ключ. Естественный первичный ключ - составляется из атрибутов, наличествующих у реального объекта (выделено): Имя Фамилия Отчество Телефон Год рождения Занимаемая должность ... Но у таблиц, записи которых ссылаются на записи нашей таблицы, должен быть внешний ключ из трех полей. Текстовых. Еще, если они изменятся, придется каскадно обновлять. В общем, стандартный мотив для введения целочисленного идентификатора. IDENTITY в T-SQL. О табельных номерах не говорим) Это не вопрос! Но, в процессе работы с БД пользователю придется как-то указывать записи в такой родительской таблице при вводе внешнего ключа дочерней. Как? Вводить целочисленный ключ (выделено)? 12345 никак не ассоциируется с Ивановым для человека. Значит, пользователю придется выбирать какую-то совокупность неключевых атрибутов (синим). EmployeeID int IDENTITY Имя Фамилия Отчество Телефон Год рождения Занимаемая должность Таким образом, эти атрибуты мы негласно считаем первичным ключом. Уникальность которого уже не гарантирована СУБД! И еще один вопрос, не менее важный. Допустим, у таблицы 5 внешних ключей. Все суррогатные. Для добавления записи, для пользователя нужно вытащить из базы 5 родительских таблиц??? Ведь все ай-ди он укажет косвенно, через осмысленные атрибуты. А если в базах по несколько тысяч записей? Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это всегда вытаскивание из базы родительской таблицы? Я неопытен, простите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:36 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Snufkin...Таким образом, эти атрибуты мы негласно считаем первичным ключом. Уникальность которого уже не гарантирована СУБД! ... пляха, я те завидую !! ты на пороге открытия ! - уникальный индекс/констрейнт === "альтернативный ключ" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:40 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
You can use UNIQUE constraints to make sure that no duplicate values are entered in specific columns that do not participate in a primary key. Although both a UNIQUE constraint and a PRIMARY KEY constraint enforce uniqueness, use a UNIQUE constraint instead of a PRIMARY KEY constraint when you want to enforce the uniqueness of a column, or combination of columns, that is not the primary key. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:44 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Первый вопрос отменяется. Я его неправильно задал))) Только второй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:47 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
на второй вопрос по еврейскому обычаю отвечу вопросом скока прниял то уже? (я в спиртовом эквиваленте) если серьезно - я вопроса не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:48 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
тьфу ты, слепой стал с Shuklin'ым попутал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:50 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
U-gene, нисколько) >>> Пользователь добавляет запись в таблицу, в которой 5 внешних ключей. Все они - бессмысленные числа, только указывающие записи в родительских таблицах. Их пять. Значит, он будет выбирать по осмысленным атрибутам. Значит, нужно вытащить 5 таблиц из базы, дать возможность выбрать соотв. строки, указав таким образом нужные значения внешних ключей. Не расходно ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:56 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
SnufkinПервый вопрос отменяется. Я его неправильно задал))) Только второй. а был второй вопрос ? Snufkin... И еще один вопрос, не менее важный. Допустим, у таблицы 5 внешних ключей. Все суррогатные. Для добавления записи, для пользователя нужно вытащить из базы 5 родительских таблиц??? Ведь все ай-ди он укажет косвенно, через осмысленные атрибуты. А если в базах по несколько тысяч записей? Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это всегда вытаскивание из базы родительской таблицы? ну и что ? в чём вопрос ? а если в "у таблицы 5 внешних ключей" -100500 милионов записей ? много записей в справочнике - нормализуй дальше ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2011, 23:57 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
SnufkinНе расходно ли? Нет, если выборка сделана правильно - через сильный фильтр. Сначала пользователь вводит фамилию (или её часть) и только потом из базы достаются всего несколько записей из большой таблицы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 00:00 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
С этим все ясно. Но частые обращения к родительским таблицам при каждом движении с дочерними - норма? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 00:01 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
А по первому вопросу я имел в виду, что не запретить же в природе полных тезок. Именно это мы сделали бы, введя UNIQUE CONSTRAINT. Формально записи разные; по смыслу - одна и та же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 00:05 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
SnufkinНо частые обращения к родительским таблицам при каждом движении с дочерними - норма? А ты посчитай: сколько раз в секунду с дочерними таблицами что-то делают, сколько обращений к родительским при этом происходит. Потом уже по этим цифрам и смотри - норма это или надо что-то делать. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 00:08 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы на дурацкие вопросы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 00:12 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
SnufkinА по первому вопросу я имел в виду, что не запретить же в природе полных тезок. Именно это мы сделали бы, введя UNIQUE CONSTRAINT. Формально записи разные; по смыслу - одна и та же. Вообще по полям можно строить неуникальные индексы. Тогда по вашим полям будет осуществляться поиск, но требования уникальности накладываться не будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 00:16 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
On 08.10.2011 0:36, Snufkin wrote: > Таким образом, эти атрибуты мы негласно считаем первичным ключом. Уникальность > которого уже не гарантирована СУБД! Нет, мы считаем это не первичным ключём, а вторичным ключём. И делаем UNIQUE CONSTRAINT на эти поля. > И еще один вопрос, не менее важный. Допустим, у таблицы 5 внешних ключей. Все > суррогатные. Для добавления записи, для пользователя нужно вытащить из базы 5 > родительских таблиц??? да Ведь все ай-ди он укажет косвенно, через осмысленные > атрибуты. А если в базах по несколько тысяч записей? да хоть по миллиарду, какая разница-то ? > Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это > всегда вытаскивание из базы родительской таблицы? Вопрос чисто технический, и запомни на него ответ: естественных ключей в реальном мире не существует. Зная этот ответ ты всегда будеш проектировать свои БД грамотно и надёжно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 19:39 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
On 08.10.2011 0:56, Snufkin wrote: > Пользователь добавляет запись в таблицу, в которой 5 внешних ключей. Все они - > бессмысленные числа, только указывающие записи в родительских таблицах. Их пять. > Значит, он будет выбирать по осмысленным атрибутам. Значит, нужно вытащить 5 > таблиц из базы, дать возможность выбрать соотв. строки, указав таким образом > нужные значения внешних ключей. Не расходно ли? Это -- вопрос правильной организации поиска в этих пяти таблицах. Как его сделаеш, так и будет. Но на самом деле ты должен понимать главное -- ДРУГОГО ПУТИ НЕТ. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 19:41 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
On 08.10.2011 1:01, Snufkin wrote: > С этим все ясно. Но частые обращения к родительским таблицам при каждом движении > с дочерними - норма? Что значит обращение ? Каждый FK -- это один JOIN. Это быстрая, дешёвая операция (JOIN по FK-PK по равенству, это быстро). Да, это норма. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 19:42 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
On 08.10.2011 1:05, Snufkin wrote: > А по первому вопросу я имел в виду, что не запретить же в природе полных тезок. > Именно это мы сделали бы, введя UNIQUE CONSTRAINT. Формально записи разные; по > смыслу - одна и та же. Я что-то не понял, ты же вроде бы собирался те же поля первичным ключём делать. Там ты про это не думал ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 19:43 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 08.10.2011 1:05, Snufkin wrote: > А по первому вопросу я имел в виду... Я что-то не понял, ты же вроде бы собирался те же поля первичным ключём делать. Там ты про это не думал ? Да, я глупость сказал... Правда, осмысленный первичный ключ, предлагаемый предметной областью, который не накладывает неестественных ограничений на записи (как запрет тезок и т.п.) это табельные и порядковые номера и т.д. В остальных случаях уместен суррогатный ключ, хотя бы с технической точки зрения. Спасибо за ответы! Отдельное спасибо MasterZiv. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2011, 17:41 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Snufkin, 0) какая база данных? SnufkinВ моем представлении, есть естественный первичный ключ и суррогатный первичный ключ. Естественный первичный ключ - составляется из атрибутов, наличествующих у реального объекта (выделено): Имя Фамилия Отчество Телефон Год рождения Занимаемая должность Если _хорошенько_ _вдуматься_ "естественный" первичный ключ - это _ВСЯ_ запись целиком. А "суррогатный" это его короткий псевдоним. Так быстрее и удобнее. SnufkinИ еще один вопрос, не менее важный. Допустим, у таблицы 5 внешних ключей. Все суррогатные. Для добавления записи, для пользователя нужно вытащить из базы 5 родительских таблиц??? Ведь все ай-ди он укажет косвенно, через осмысленные атрибуты. А если в базах по несколько тысяч записей? Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это всегда вытаскивание из базы родительской таблицы? 1) Покажите, что за данные имеющие 5 внешних ключей для одной сущности? 2) Кто сказал, что для проверки внешнего ключа нужно "вытаскивание из базы родительской таблицы?" Что вы хотите проверить таким образом? Достаточно проверить существование одного конкретного ключа в _индексе_. 3) Зачем вообще нужны внешние ключи? Вот, например, вы добавляете сотрудника в отдел, зачем нужна проверка внешнего ключа в таблице "список существующих отделов"? Если-бы такого отдела не существовало - вы бы не захотели добавлять туда сотрудника). А если у вас вдруг происходят такие "левые" добавления - проблема в вашем приложении. Ну или например у того-же сотрудника есть внешний ключ на начальника. Механизм внешних ключей может проверить только принципиальное наличие "начальника" в таблице сотрудников, но нисколько не поможет избежать ситуации когда уборщица руководит генеральным директором. Собсна, нафиг тогда нужна такая проверка? Избыточный педантизм ценой системных ресурсов? Мораль: DROP ALL FOREIGN KEYS; Все (разумные) проверки на уровне приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 00:27 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
kuguМораль: DROP ALL FOREIGN KEYS ....и убейся об стену сам, не дожидаясь пока это с тобой проделают другие. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 00:42 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovkuguМораль: DROP ALL FOREIGN KEYS ....и убейся об стену сам, не дожидаясь пока это с тобой проделают другие. Можно я?! :). Бедный Кугу... "нисколько не поможет избежать ситуации когда уборщица руководит генеральным директором. Собсна, нафиг тогда нужна такая проверка?". Действительно, если я на машине добираюсь до работы за 15 мин, на маршрутке за 1 час, но не могу на машине добраться за 3 минуты - нафиг мне нужна такая машина! :) Или счастливый... Наверное, у Кугу все данные в БД попадают и будут попадать только через "приложение"... И уж "приложение" точно не допускает, чтобы уборщица руководила генеральным директором. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 11:18 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
АнатоЛойНаверное, у Кугу все данные в БД попадают и будут попадать только через "приложение"... И уж "приложение" точно не допускает, чтобы уборщица руководила генеральным директором. :) Да нет, просто ему никогда не приходилось писать ничего серьезнее "Самого-Супер-Пупер-Раскрутейшего-Приложения-По-Учету-Всего-Превсего-Моего-Домашнего-Видео". Иначе бы он знал, что в сложном приложении легко допустить ошибку, которая будет иногда потихоньку вносить некорректные данные, и, когда спустя полгода это всплывет, выяснится, что даже продажа сего гения на органы не позволит компенсировать и сотой части ущерба. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 11:25 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
iljyАнатоЛойНаверное, у Кугу все данные в БД попадают и будут попадать только через "приложение"... И уж "приложение" точно не допускает, чтобы уборщица руководила генеральным директором. :) Да нет, просто ему никогда не приходилось писать ничего серьезнее "Самого-Супер-Пупер-Раскрутейшего-Приложения-По-Учету-Всего-Превсего-Моего-Домашнего-Видео". Иначе бы он знал, что в сложном приложении легко допустить ошибку, которая будет иногда потихоньку вносить некорректные данные, и, когда спустя полгода это всплывет, выяснится, что даже продажа сего гения на органы не позволит компенсировать и сотой части ущерба. это скорее вышеотозвавшиеся на реплику об FK ничего кроме унылых говнобухгалтерий на 10 пользователей не писали. авторНаверное, у Кугу все данные в БД попадают и будут попадать только через "приложение" хвастаетесь тем что непойми кто может ковырять напрямую таблицы в вашей автор"Самого-Супер-Пупер-Раскрутейшего-Приложения-По-Учету-Всего-Превсего-Моего-Домашнего-Видео" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 22:05 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
даете блин...хвастаетесь тем что непойми кто может ковырять напрямую таблицы Констатируем упрямый факт. Ибо - будут. Что ни делай, всё равно - будут. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 22:18 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Еще один потенциальный донор органов... даете блин..., во-первых - я говорил про ситуацию, в которой доступ идет через приложение, что не гарантирует. во-вторых - не не пойми кто, а пользователь, имеющий права на доступ к базе. И могущий воспользоваться этими правами минуя конкретно ваше приложение. Что-то последнее время столько "революционеров" с гениальными идеями появляется - оборжаться. То декларативный контроль предлагают отменить, то еще что-нибудь. Не так давно был один - так вообще предлагал скуль отменить как таковой, а все выборки данных делать клиентскими процедурами под лозунгом ".NET рулит!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 22:24 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovдаете блин...хвастаетесь тем что непойми кто может ковырять напрямую таблицы Констатируем упрямый факт. Ибо - будут. Что ни делай, всё равно - будут. ...а что если воспользоваться имеющимся инструментарием по разделению прав доступа?! нет-нет-нет, что за чушь... глупейшая идея. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 22:26 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
даете блин......а что если воспользоваться имеющимся инструментарием по разделению прав доступа?! нет-нет-нет, что за чушь... глупейшая идея. Даа? И этот инструментарий вам гарантирует подключение только через ваше приложение? Ну-ну. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 22:28 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
iljyдаете блин......а что если воспользоваться имеющимся инструментарием по разделению прав доступа?! нет-нет-нет, что за чушь... глупейшая идея. Даа? И этот инструментарий вам гарантирует подключение только через ваше приложение? Ну-ну. я понял о чем вы, не буду дальше развивать. в целом, после попития водички захотелось извиниться за резкость. как приду с говноработы периодически испытываю загадочные эмоциональные "подъемы" на ровном месте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 22:32 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
даете блин..., бывает. Вы тоже извините если что ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2011, 22:35 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
MasterZivВопрос чисто технический, и запомни на него ответ: естественных ключей в реальном мире не существует. У меня как раз такой случай - естественный кюч существует. Предметная область - железная дорога. На рельсах утанавливаются датчики. С них снимаются данные при прохождении поезда. Данные снимаются с каждой колесной пары. Через данный участок пути в одно и то же время может пройти только один поезд. Данные загоняются в две таблицы: Log_Train TrainTime smalldatetime SiteID tinyint - идентификатор данного участка пути NumberOfAxels smallint ... PK - TrainTime DESC + SiteID ASC Log_Axle TrainTime smalldatetime SiteID tinyint - идентификатор данного участка пути AxleNumber smallint AxleSpeed real ... PK - TrainTime DESC + SiteID ASC + AxleNumber ASC В Log_Train собирается информация о поезде - число колесных пар, средняя скорость и т.д. В Log_Axle - собирается инфа по каждой колесной паре данного поезда. Спрашивается - зачем нужен суррогатный ключ в данном случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 13:36 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52У меня как раз такой случай - естественный кюч существует. Не бывает таких случаев. Massa52Через данный участок пути в одно и то же время может пройти только один поезд. И совершенно случайно он проходит по этому участку в последнее воскресенье октября между двумя и тремя часами ночи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 14:59 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
softwarerMassa52У меня как раз такой случай - естественный кюч существует. Не бывает таких случаев. Massa52Через данный участок пути в одно и то же время может пройти только один поезд. И совершенно случайно он проходит по этому участку в последнее воскресенье октября между двумя и тремя часами ночи. Это когда стрелки переводят? - так уже не переводят. И потом - есть UTC время. На крайняк - можно секуду подкинуть - чтоб не совпадало в последнее воскресенье октября. А если взять полное время - то уж точно совпадение в миллисекундах будет с ничтожной долей вероятности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 17:11 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52Это когда стрелки переводят? - так уже не переводят. И потом - есть UTC время. На крайняк - можно секуду подкинуть - чтоб не совпадало в последнее воскресенье октября. А если взять полное время - то уж точно совпадение в миллисекундах будет с ничтожной долей вероятности. Да, да. А Советский Союз выиграл Куликовскую битву . Делайте что хотите (напевая: "В морг, в морг, доктор сказал в морг и это значит в морг навсегда...") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 17:25 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Иногда приходится перепроцессивать поезда - при ошибочной калибрации например. Тогда поезд при таких ключах разместится строго на том же месте по времени, а при использовании суррогатног ключа будет потеряна сортировка по времени. А так как основные запросы - это запросы во временном диапазоне - то по идее эти запросы должны отрабатываться быстрее - нежели по некластерному индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 17:31 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Поэтому - усилия затраченные на отработку перевода стрелок один раз в год вполне окупаются выигрышем во времени отработки запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 17:46 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Не уговаривайте, я так делать всё равно не буду. После того, как я провёл на работе десяток-другой-третий ночей, разгребая результаты сомнительных решений (в основном других программистов), я приобрёл устойчивую привычку программировать так, чтобы спокойно спать по ночам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 17:49 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
softwarer, Да я не уговариваю - просто хотел сказать - что бывают случаи - когда можно и даже может быть нужно обойтись без суррогатных ключей, которые не несут никакой информативности, кроме фиксации уникальности записи. Правда нужно сознаться - что у меня в конторе никто моих взглядов не разделяет и сейчас у нас идет бодаловка - добавлять суррогантные ключи или нет. Вот и пришел на форум - чтобы послушать народ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 17:59 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52, такие случаи бывают сугубо теоретически (в плохом значении слова "теория"). Потому что они перекрываются одним важным фактом: любые данные могут быть внесены с ошибкой. Например, ИНН уникален? Ну теоретически да. А потом появляется КПП. А ИНН физлица уникален? Вроде как да. Только бывает, что оператор вносил данные с листа с распечатанной таблицей и посмотрел не в ту строку - и в результате в базе у Петрова ИНН Сидорова. А потом Сидоров приходит, и совсем другой оператор в другом офисе не может его ввести - потому как ИНН "уникален". Время, говорите, уникально? А у меня в практике был случай, когда дата на сервере прыгнула в 2030-й год. Поэтому вопрос очень прост: мы либо программируем геморрой, либо не программируем геморрой. Я свой выбор сделал, и причины менять его вряд ли появятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 18:22 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
softwarer, То что дата на компьютере прыгает - это факт. Еще есть и человеческий фактор - приходит чел на сайт - смотрит - а на компе время сбито(на самом деле там GMT) - ну он и переводит часы на локальное время. Время для поезда - очень важный фактор - и обычно на сайтах куча тулза синхронизации времени. Для того - чтобы бороться с неправильным временем - данные(RAW дата) закидываются параллельно в архив и процесснутые в SQL. Если чтот не то с данными - сбитое время или сбита каллибрация, то достаются RAW дата из архива и снова процессятся. Тут как бы соблюдение правильного времени - это правило. И суррогатный ключ в данном случае от неправильного времени не спасает. Он может спасти только при перекрытии времени - чтоб не накрылись старые данные. Но опять таки есть RAW дата - и все без проблем восстанавливается - так как даные каждый день просматриваются кучей операторов вагонов и если че не так - тут же кляуза - ну мы достаем RAW дата и вперед с песней. Диапазон то однодневный - там порядка 20 поездов. Кинул зип архив проге - та перемолотит и в SQL и там все опять тип-топ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 18:53 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Суррогатный ключ не спасает от неправильных данных. Суррогатный ключ спасает от большого геморроя при разгребании неправильных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 18:59 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
softwarer, То что дата на компьютере прыгает - это факт. Еще есть и человеческий фактор - приходит чел на сайт - смотрит - а на компе время сбито(на самом деле там GMT) - ну он и переводит часы на локальное время. Время для поезда - очень важный фактор - и обычно на сайтах куча тулза синхронизации времени. Для того - чтобы бороться с неправильным временем - данные(RAW дата) закидываются параллельно в архив и процесснутые в SQL. Если чтот не то с данными - сбитое время или сбита каллибрация, то достаются RAW дата из архива и снова процессятся. Тут как бы соблюдение правильного времени - это правило. И суррогатный ключ в данном случае от неправильного времени не спасает. Он может спасти только при перекрытии времени - чтоб не накрылись старые данные. Но опять таки есть RAW дата - и все без проблем восстанавливается - так как даные каждый день просматриваются кучей операторов вагонов и если че не так - тут же кляуза - ну мы достаем RAW дата и вперед с песней. Диапазон то однодневный - там порядка 20 поездов. Кинул зип архив проге - та перемолотит и в SQL и там все опять тип-топ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 18:59 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
2 Massa52 В огороде бузина, в Киеве дядька Massa52 а при использовании суррогатног ключа будет потеряна сортировка по времениПочему? Massa52 А так как основные запросы - это запросы во временном диапазоне - то по идее эти запросы должны отрабатываться быстрее - нежели по некластерному индексу.И чем этому помешал суррогатный ключ. Ваши затраты - на поддержание индекса. Использование суррогатного первичного ключа совсем не запрещает использования альтернативных уникальных ключей. И кластеризовать по этому ключу тоже не обязательно. Это просто способ отличить одну запись от другой. Пусть пользователь "мамой клянется" что естественный ключ уникален, однако в военное время и по особому распоряжению уникальность может быть нарушена. А уж если на данную запись есть ссылки из других таблиц, то преимущества суррогатного ключа становятся полностью очевиднымыми. softwarer Не бывает таких случаев.Поддерживаю. Вы можете не использовать суррогатный ключ, ваше право, но вы должны четко осознавать последствия: что будет если... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2012, 22:47 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
> Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это > всегда вытаскивание из базы родительской таблицы? Тут у тебя всё понамешано, всё в кучу, 20 проблем в одном вопросе. Но мне некогда, отвечу поэтому на главный вопрос и кратко: 0) (замечание) естественных ключей не бывает. 1) Как правило, во всех таблицах в реальных БД бывает 2 ключа: внутренний, для СУБД (он -- PK) и ключ в терминах, доступных пользователю (тогда он обычно оформляется как UNIQUE). Второй ключ может в таблице отсутствовать в виде ключа, тогда это НЕУНИКАЛЬНЫЙ набор полей из таблицы, который служит для визуальной идентификации записи пользователем. Второй ключ также может быть уникальным с точки зрения пользователей, но неуникальным в СУБД (нет уникального индекса). Иногда для некоторых сущностей, например, сугубо служебных, второй ключ может отсутствовать, тогда его роль выполняет первый, основной ключ. 2) каждый раз, когда тебе нужно ввести или найти какую-то дочернюю запись (из дочерней таблицы), тебе нужно как-то задать ключ родительской таблицы, это делается путём предъявления пользователю полей пользовательского ключа (если его нет -- то всех полей таблицы) в виде списка для выбора. Это обычно комбик или список. Пользователь выбирает запись в этом списке и таким образом задаёт значения полей PK родительской таблицы. Т.о. ДА, это всегда вытаскивание из базы записей родительской таблицы. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 00:20 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52 а при использовании суррогатног ключа будет потеряна сортировка по времениПочему? Потому что имеет место репроцесс данных. И тода физически - данные устаревшие по времени оказываются впереди(позади) свежих данных. И суррогатный ключ(на сегоднящний день их два типа) никак этому не воспрепятствует. Лучше уж тогда самому генерить суррогатный ключ из времени и сайта ID. SERG1257И чем этому помешал суррогатный ключ. Ваши затраты - на поддержание индекса. Использование суррогатного первичного ключа совсем не запрещает использования альтернативных уникальных ключей. И кластеризовать по этому ключу тоже не обязательно. Это просто способ отличить одну запись от другой. Пусть пользователь "мамой клянется" что естественный ключ уникален, однако в военное время и по особому распоряжению уникальность может быть нарушена. А уж если на данную запись есть ссылки из других таблиц, то преимущества суррогатного ключа становятся полностью очевиднымыми. Алтернативный уникальный ключ не гарантирует последовательное физическое размещение данных. А основная работа с данными требует регулярного выдирания именно последовательно рассположенного куска данных и демонстрации пользователю. softwarer Не бывает таких случаев.Поддерживаю. Вы можете не использовать суррогатный ключ, ваше право, но вы должны четко осознавать последствия: что будет если... Что будет - что будет, а ничего не будет, вычеркним из списка и все(из анекдота). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 02:54 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52, В своё время меня тоже душила жаба, что добавляя суррогатный ключ, я как-то непродуктивно увеличиваю размер БД, усложняю структуру и пр. В общем, комплексы, вызванные небольшим размером жёсткого диска (диск был 10 Мб, да-да 10 мегабайт, СУБД FoxPro 2.0) Потом эти комплексы прошли, и сейчас я всегда, не задумываясь, при создании таблицы первым делом создаю суррогатный ключ, потому-что знаю, он всегда нужен. Нужен он и тебе, просто ты ещё об этом не знаешь. Попробую не быть голословным, разберём твою ситуацию: поезд проходит через датчик и этот момент фиксируется в БД. Твои таблицы мы видели. Не вдаваясь в подробности, я просто добавляю к ним суррогатный автоинкрементный ключ. По мере работы твоей программы в таблице в этом поле будут значения вида 1 2 3 4 5 6 7 ........ 100499 100500. Вроде, пока ничего интересного, они вроде и нах не нужны. Ну, а теперь, представь, прибегает к тебе менеджер, и начинает на тебя орать, что твоя грёбанная программа покоцала данные за один месяц позапрошлого года, мол, данные с датчиков за январь и февраль есть, есть за апрель, а вот за март нету. Ты лезешь в БД, смотришь - действительно данных нет. Стоишь, обтекаешь, в башке одна мысль: "или я накосячил, или какая-то сволочь данные грохнула, или вообще там данные не поступали" Главное, ответить нечего :-( Теперь представь ситуацию, у тебя есть суррогатный ключ и прибегает этот-же менеджер. Открываешь БД, смотришь, действительно, марта нету, однако записи 1001, 1002, 1003 относятся к февралю, 1004, 1005, 1006 уже к апрелю относятся. Показываешь всё это менеджеру и отправляешь его лесом выяснять, почему данные в марте не поступали. Ах, да, вспоминает он, там тогда КамАЗ перевернулся, а потом вообще рельсы бомжи спёрли. Ну, и самое главное, сурогатный ключ не позволяет, или по крайней мере затрудняет изготовление говноБД. Давай рассмотрим твою БД Log_Train TrainTime smalldatetime SiteID tinyint - идентификатор данного участка пути NumberOfAxels smallint ... Log_Axle TrainTime smalldatetime SiteID tinyint - идентификатор данного участка пути AxleNumber smallint AxleSpeed real Тут в обоих таблицах первые два поля содержат одинаковую информацию, и, если вы захотите эти две таблицы связать SQL-запросом, то он будет выглядеть ~ так: Код: sql 1. Громоздко, да? Поэтому лучше сделать ключ, тогда: Log_Train Log_TrainID integer TrainTime smalldatetime SiteID tinyint - идентификатор данного участка пути NumberOfAxels smallint ... Log_Axle Log_AxleID integer Log_TrainID integer TrainTime smalldatetime SiteID tinyint - идентификатор данного участка пути AxleNumber smallint AxleSpeed real Запрос будет выглядеть так Код: sql 1. Уже лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 07:40 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
zeon11Massa52, Теперь представь ситуацию, у тебя есть суррогатный ключ и прибегает этот-же менеджер. Открываешь БД, смотришь, действительно, марта нету, однако записи 1001, 1002, 1003 относятся к февралю, 1004, 1005, 1006 уже к апрелю относятся. Показываешь всё это менеджеру и отправляешь его лесом выяснять, почему данные в марте не поступали. Ах, да, вспоминает он, там тогда КамАЗ перевернулся, а потом вообще рельсы бомжи спёрли. В жизни все не так - после репроцессинга поездов 1004, 1005 1006 могут ваще к апрелю не относиться. После репроцессинга получается каша - так как репроцессинг означает - что берутся старые данные с новыми парамерами(например каллибрации - скажем заморозки - и платформа замерзла и чувствительность ценсоров повысилась - вес вагона из-за этого сильно подскочил) - надо срочно заново прогнать данные за февраль - а во дворе апрель - даже и такое бывает - данные за февраль снова обрабатывают - отчет за февраль не нравится менеджеру перевозок. В этом случае уж лучше генерить самому суррогатный ключ из времени и сайта. Алгоритм то простой - чуток сложнее - конечно чем добавлять единицу. zeon11 Код: sql 1. Громоздко, да? Согласен - не эстетично - лишнее условие, которое будет постоянно сопровождать проект. Но есть один бенефит - если мне нужны только колесные пары и я знаю время - то не нужно цеплять Log_Train. Но это слабо утешение. Итак - поскольку данная предметная область позволяет легко генерить TrainID из TrainTime и SiteID - то мне кажется - это лучшее решение для генерации суррогатног ключа - нежели использование стандартных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 11:27 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52, я уважаю твою настойчивость, но позволь мне мягко выразить свои сомнения. 1. Я вообще не уверен, что поле типа SmallDateTime подходит в качестве внешнего ключа, т.е. мне кажется, что связь между двумя таблицами не возможна (т.е. ты не сможешь их объединить SQL-запросом), или будет весьма "корявой". 2. Меня весьма настораживает твоё неоднократно сказанное слово "репроцессинг". Я так понял, что первоначальных данных, пришедших с датчиков уже давно нет? Их каждый раз перелопачивают-переписывают по прихоти менеджера, в зависоимости от температуры на улице? Если это так, то мне кажется, у вас в конторе всё очень плохо, так не должно быть. Если хочешь знать, как стоило-бы сделать в подобной ситуации, то: 1. Данные с датчиков ОДИН раз записываются в БД, не зависимо от того, правильные они или кривые, мороз или жара, сломанный датчик или нет, - всё: пришли данные - записали. 2. В БД ведётся справочник датчиков и ведётся там-же временнОй журнал исправности датчиков с соответствующим коэффициентом, например, 33-й датчик в июне коэффициент 1.000 - данные датчика попадают менеджеру без измененний. Этот-же датчик в ноябре - коэффициент 0.786. Т.е. ты мысль мою понял? Первичные данные не трогаются, а если кто хочет похимичить с данными - пусть балуется с коэффициентами. И никакого "репроцессинга" Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 12:14 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52И тода физически - данные устаревшие по времени оказываются впереди(позади) свежих данных.... Алтернативный уникальный ключ не гарантирует последовательное физическое размещение данных. Меня всегда удивляло: почему в русском языке именно физике оказана такая честь, что слово "физически" означает "мамой клянусь, на самом деле так"? Почему категоричный отказ звучит "это физически невозможно", а не "химически", "биологически", "математически"? Так вот: что, в Вашем представлении, есть "физическое" размещение данных в БД, почему оно важно, и как Вы собираетесь его использовать, что ему мешает дополнительный ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 12:35 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
zeon11, С температурой я конечно промахнулся - это я ну чтоб как то объяснить причину репроцессинга. Но такая процедура довольно часто происходит при пуско-наладке системы - когда еще не все устаканено. И этот период иногда длится до года. Ну а в тех - в которых переходный процесс закончился - тоже бывают казусы - отказ ценсора. И есть куча процедур - как отлавливать динамически такую ситуацию - вплоть до мануального отключения ценсора. И это естественно иногда вызывает репоцессинг. Исходные данные никуда не деваются - а аккуратно зипуются и складываются в папочку archive недельными порциями. В случае репросессинга - достаешь такой архивчик и закидываешь в процедуре процессинга. Теперь о генерируемом "вручную" ключе - навскидку - конвертишь TrainTime в Hex строку и добавляешь Hex сайт - чем не ключ? Fisher, "Физическое" - я взял из объяснения - чем кластерный индех отличается от некластерного. Из того что основная масса запросов для репортов и ваще идет по непрерывному отрезку времени. За прошлый месяц, год, день, топ 20 плохих вагонов за прошедший месяц и все в таком роде. Ясень пень - кластерный индех лучше. Теперь - как протекает сам процесс - Прошел поезд - данные сформировались и поступили на обработку - отработал "INSERT" и данные в SQL - до следующего поезда можно перекурить. А вот когда пользователи, сидя за монитором в ожидании выборки, нервно курят - тут однозначно желательно все продумать про оптимизацию "SELECTа" в мелочах - чтоб сберечь нервы юзеру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 14:14 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52"Физическое" - я взял из объяснения - чем кластерный индех отличается от некластерного.а вы умеете кластерный индекс делать только по первичному ключу, штоле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2012, 14:29 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Тут уже обсуждался кластерный индекс по дате: Кластерный индех ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 03:52 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52Тут уже обсуждался кластерный индекс по дате: Кластерный индеха у вас одноцэ, разве, чтобы на этот топик ссылаться? иначе не понятно, зачем вы привели его в пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 11:22 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Прошу прощения egorych, Топик я привел - увидел там чтот подобное тому, что я пытаюсь делать. Я не догнал вашу идею. Если скажем - я делаю первичный суррогатный ключ и делаю его некластерным. Потом строю кластерный индех по TrainTime. Вы это имели ввиду чвоим вопросом? Что тогда? Запросы с select * From ... WHERE BETWEEN TrainTime > AND TrainTime < будут летать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:34 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52Что тогда? Запросы с select * From ... WHERE BETWEEN TrainTime > AND TrainTime < будут летать? Вообще-то они будут летать при любом типе индекса, не только кластерном... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2012, 17:40 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52Если скажем - я делаю первичный суррогатный ключ и делаю его некластерным. Потом строю кластерный индех по TrainTime.по TrainTime DESC + SiteID ASC, тогда Massa52Запросы с select * From ... WHERE BETWEEN TrainTime > AND TrainTime < будут летать с той же скоростью, как и с вашим естественным ключём по этим полям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2012, 21:22 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
egorych, Спасибо. Я как то упустил этот вариант. Сейчас проект только разворачивается - как только начнется работа с данными - построю обе структуры и протестирую на ключевых SELECT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2012, 02:01 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Не уверен. Как я представляю ситуацию с кластерным и некластерным индексом - это как отоваривание в супермаркете. Когда с кластерным - ты приходишь в супермаркет - а там уже все разложено по тележкам(это конечно в идеале) - взял тележку под нужным номером и покатил. А с некластерным - это значит с запиской от жены - купи это, это и еще не забудь ... то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2012, 03:34 |
|
||
|
Теоретический вопрос по первичным ключам
|
|||
|---|---|---|---|
|
#18+
Massa52Как я представляю ситуацию с кластерным и некластерным индексом Как-то ты хреново её представляешь... Нет, может у MS так и есть, конечно... Ну так в мире есть куча гораздо лучших СУБД. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2012, 12:54 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1541867]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
97ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 489ms |

| 0 / 0 |
