powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Теоретический вопрос по первичным ключам
59 сообщений из 59, показаны все 3 страниц
Теоретический вопрос по первичным ключам
    #37473702
Snufkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это очень базовый вопрос, на самом деле.
В моем представлении, есть естественный первичный ключ и суррогатный первичный ключ. Естественный первичный ключ - составляется из атрибутов, наличествующих у реального объекта (выделено):
Имя
Фамилия
Отчество

Телефон
Год рождения
Занимаемая должность
...

Но у таблиц, записи которых ссылаются на записи нашей таблицы, должен быть внешний ключ из трех полей. Текстовых. Еще, если они изменятся, придется каскадно обновлять. В общем, стандартный мотив для введения целочисленного идентификатора. IDENTITY в T-SQL. О табельных номерах не говорим)
Это не вопрос!
Но, в процессе работы с БД пользователю придется как-то указывать записи в такой родительской таблице при вводе внешнего ключа дочерней. Как? Вводить целочисленный ключ (выделено)? 12345 никак не ассоциируется с Ивановым для человека. Значит, пользователю придется выбирать какую-то совокупность неключевых атрибутов (синим).
EmployeeID int IDENTITY
Имя
Фамилия
Отчество
Телефон
Год рождения
Занимаемая должность

Таким образом, эти атрибуты мы негласно считаем первичным ключом. Уникальность которого уже не гарантирована СУБД!

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

Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это всегда вытаскивание из базы родительской таблицы?

Я неопытен, простите.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473703
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Snufkin...Таким образом, эти атрибуты мы негласно считаем первичным ключом. Уникальность которого уже не гарантирована СУБД!
...
пляха, я те завидую !! ты на пороге открытия !
- уникальный индекс/констрейнт === "альтернативный ключ"
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473707
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473711
Snufkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Первый вопрос отменяется. Я его неправильно задал))) Только второй.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473713
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на второй вопрос по еврейскому обычаю отвечу вопросом
скока прниял то уже? (я в спиртовом эквиваленте)

если серьезно - я вопроса не понял.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473714
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу ты, слепой стал
с Shuklin'ым попутал
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473717
Snufkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
U-gene,

нисколько)
>>>
Пользователь добавляет запись в таблицу, в которой 5 внешних ключей. Все они - бессмысленные числа, только указывающие записи в родительских таблицах. Их пять. Значит, он будет выбирать по осмысленным атрибутам. Значит, нужно вытащить 5 таблиц из базы, дать возможность выбрать соотв. строки, указав таким образом нужные значения внешних ключей. Не расходно ли?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473718
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SnufkinПервый вопрос отменяется. Я его неправильно задал))) Только второй.

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

Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это всегда вытаскивание из базы родительской таблицы?

ну и что ? в чём вопрос ? а если в "у таблицы 5 внешних ключей" -100500 милионов записей ?
много записей в справочнике - нормализуй дальше !
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473724
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SnufkinНе расходно ли?
Нет, если выборка сделана правильно - через сильный фильтр. Сначала пользователь вводит
фамилию (или её часть) и только потом из базы достаются всего несколько записей из большой
таблицы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473726
Snufkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С этим все ясно. Но частые обращения к родительским таблицам при каждом движении с дочерними - норма?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473727
Snufkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А по первому вопросу я имел в виду, что не запретить же в природе полных тезок. Именно это мы сделали бы, введя UNIQUE CONSTRAINT. Формально записи разные; по смыслу - одна и та же.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473731
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SnufkinНо частые обращения к родительским таблицам при каждом движении с дочерними - норма?

А ты посчитай: сколько раз в секунду с дочерними таблицами что-то делают, сколько
обращений к родительским при этом происходит. Потом уже по этим цифрам и смотри - норма
это или надо что-то делать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473733
Snufkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы на дурацкие вопросы)
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37473739
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SnufkinА по первому вопросу я имел в виду, что не запретить же в природе полных тезок. Именно это мы сделали бы, введя UNIQUE CONSTRAINT. Формально записи разные; по смыслу - одна и та же.
Вообще по полям можно строить неуникальные индексы. Тогда по вашим полям будет осуществляться поиск, но требования уникальности накладываться не будут.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37474110
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08.10.2011 0:36, Snufkin wrote:

> Таким образом, эти атрибуты мы негласно считаем первичным ключом. Уникальность
> которого уже не гарантирована СУБД!

Нет, мы считаем это не первичным ключём, а вторичным ключём.
И делаем UNIQUE CONSTRAINT на эти поля.

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

да

Ведь все ай-ди он укажет косвенно, через осмысленные
> атрибуты. А если в базах по несколько тысяч записей?

да хоть по миллиарду, какая разница-то ?

> Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это
> всегда вытаскивание из базы родительской таблицы?

Вопрос чисто технический, и запомни на него ответ:
естественных ключей в реальном мире не существует.
Зная этот ответ ты всегда будеш проектировать свои БД грамотно
и надёжно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37474112
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08.10.2011 0:56, Snufkin wrote:

> Пользователь добавляет запись в таблицу, в которой 5 внешних ключей. Все они -
> бессмысленные числа, только указывающие записи в родительских таблицах. Их пять.
> Значит, он будет выбирать по осмысленным атрибутам. Значит, нужно вытащить 5
> таблиц из базы, дать возможность выбрать соотв. строки, указав таким образом
> нужные значения внешних ключей. Не расходно ли?

Это -- вопрос правильной организации поиска в этих пяти таблицах.
Как его сделаеш, так и будет.
Но на самом деле ты должен понимать главное -- ДРУГОГО ПУТИ НЕТ.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37474114
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08.10.2011 1:01, Snufkin wrote:
> С этим все ясно. Но частые обращения к родительским таблицам при каждом движении
> с дочерними - норма?

Что значит обращение ? Каждый FK -- это один JOIN. Это быстрая, дешёвая операция
(JOIN по FK-PK по равенству, это быстро).
Да, это норма.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37474116
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08.10.2011 1:05, Snufkin wrote:

> А по первому вопросу я имел в виду, что не запретить же в природе полных тезок.
> Именно это мы сделали бы, введя UNIQUE CONSTRAINT. Формально записи разные; по
> смыслу - одна и та же.

Я что-то не понял, ты же вроде бы собирался те же поля первичным ключём делать.
Там ты про это не думал ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37474649
Snufkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivOn 08.10.2011 1:05, Snufkin wrote:

> А по первому вопросу я имел в виду...

Я что-то не понял, ты же вроде бы собирался те же поля первичным ключём делать.
Там ты про это не думал ?


Да, я глупость сказал...

Правда, осмысленный первичный ключ, предлагаемый предметной областью, который не накладывает неестественных ограничений на записи (как запрет тезок и т.п.) это табельные и порядковые номера и т.д. В остальных случаях уместен суррогатный ключ, хотя бы с технической точки зрения.

Спасибо за ответы! Отдельное спасибо MasterZiv.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37499900
kugu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Snufkin,

0) какая база данных?

SnufkinВ моем представлении, есть естественный первичный ключ и суррогатный первичный ключ. Естественный первичный ключ - составляется из атрибутов, наличествующих у реального объекта (выделено):
Имя
Фамилия
Отчество
Телефон
Год рождения
Занимаемая должность

Если _хорошенько_ _вдуматься_ "естественный" первичный ключ - это _ВСЯ_ запись целиком. А "суррогатный" это его короткий псевдоним. Так быстрее и удобнее.

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

Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это всегда вытаскивание из базы родительской таблицы?

1) Покажите, что за данные имеющие 5 внешних ключей для одной сущности?

2) Кто сказал, что для проверки внешнего ключа нужно "вытаскивание из базы родительской таблицы?" Что вы хотите проверить таким образом? Достаточно проверить существование одного конкретного ключа в _индексе_.

3) Зачем вообще нужны внешние ключи? Вот, например, вы добавляете сотрудника в отдел, зачем нужна проверка внешнего ключа в таблице "список существующих отделов"? Если-бы такого отдела не существовало - вы бы не захотели добавлять туда сотрудника). А если у вас вдруг происходят такие "левые" добавления - проблема в вашем приложении.
Ну или например у того-же сотрудника есть внешний ключ на начальника. Механизм внешних ключей может проверить только принципиальное наличие "начальника" в таблице сотрудников, но нисколько не поможет избежать ситуации когда уборщица руководит генеральным директором. Собсна, нафиг тогда нужна такая проверка? Избыточный педантизм ценой системных ресурсов?
Мораль: DROP ALL FOREIGN KEYS; Все (разумные) проверки на уровне приложения.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37499914
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuguМораль: DROP ALL FOREIGN KEYS
....и убейся об стену сам, не дожидаясь пока это с тобой проделают другие.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37500314
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovkuguМораль: DROP ALL FOREIGN KEYS
....и убейся об стену сам, не дожидаясь пока это с тобой проделают другие.

Можно я?! :).
Бедный Кугу...
"нисколько не поможет избежать ситуации когда уборщица руководит генеральным директором. Собсна, нафиг тогда нужна такая проверка?". Действительно, если я на машине добираюсь до работы за 15 мин, на маршрутке за 1 час, но не могу на машине добраться за 3 минуты - нафиг мне нужна такая машина! :)


Или счастливый...

Наверное, у Кугу все данные в БД попадают и будут попадать только через "приложение"... И уж "приложение" точно не допускает, чтобы уборщица руководила генеральным директором. :)
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37500329
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойНаверное, у Кугу все данные в БД попадают и будут попадать только через "приложение"... И уж "приложение" точно не допускает, чтобы уборщица руководила генеральным директором. :)
Да нет, просто ему никогда не приходилось писать ничего серьезнее "Самого-Супер-Пупер-Раскрутейшего-Приложения-По-Учету-Всего-Превсего-Моего-Домашнего-Видео". Иначе бы он знал, что в сложном приложении легко допустить ошибку, которая будет иногда потихоньку вносить некорректные данные, и, когда спустя полгода это всплывет, выяснится, что даже продажа сего гения на органы не позволит компенсировать и сотой части ущерба.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37501656
iljyАнатоЛойНаверное, у Кугу все данные в БД попадают и будут попадать только через "приложение"... И уж "приложение" точно не допускает, чтобы уборщица руководила генеральным директором. :)
Да нет, просто ему никогда не приходилось писать ничего серьезнее "Самого-Супер-Пупер-Раскрутейшего-Приложения-По-Учету-Всего-Превсего-Моего-Домашнего-Видео". Иначе бы он знал, что в сложном приложении легко допустить ошибку, которая будет иногда потихоньку вносить некорректные данные, и, когда спустя полгода это всплывет, выяснится, что даже продажа сего гения на органы не позволит компенсировать и сотой части ущерба.
это скорее вышеотозвавшиеся на реплику об FK ничего кроме унылых говнобухгалтерий на 10 пользователей не писали.
авторНаверное, у Кугу все данные в БД попадают и будут попадать только через "приложение"
хвастаетесь тем что непойми кто может ковырять напрямую таблицы в вашей автор"Самого-Супер-Пупер-Раскрутейшего-Приложения-По-Учету-Всего-Превсего-Моего-Домашнего-Видео"
?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37501669
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даете блин...хвастаетесь тем что непойми кто может ковырять напрямую таблицы

Констатируем упрямый факт. Ибо - будут. Что ни делай, всё равно - будут.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37501673
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один потенциальный донор органов...


даете блин...,

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

Что-то последнее время столько "революционеров" с гениальными идеями появляется - оборжаться. То декларативный контроль предлагают отменить, то еще что-нибудь. Не так давно был один - так вообще предлагал скуль отменить как таковой, а все выборки данных делать клиентскими процедурами под лозунгом ".NET рулит!"
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37501676
Dimitry Sibiryakovдаете блин...хвастаетесь тем что непойми кто может ковырять напрямую таблицы

Констатируем упрямый факт. Ибо - будут. Что ни делай, всё равно - будут.

...а что если воспользоваться имеющимся инструментарием по разделению прав доступа?!
нет-нет-нет, что за чушь... глупейшая идея.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37501679
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даете блин......а что если воспользоваться имеющимся инструментарием по разделению прав доступа?!
нет-нет-нет, что за чушь... глупейшая идея.
Даа? И этот инструментарий вам гарантирует подключение только через ваше приложение? Ну-ну.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37501685
iljyдаете блин......а что если воспользоваться имеющимся инструментарием по разделению прав доступа?!
нет-нет-нет, что за чушь... глупейшая идея.
Даа? И этот инструментарий вам гарантирует подключение только через ваше приложение? Ну-ну.
я понял о чем вы, не буду дальше развивать.

в целом, после попития водички захотелось извиниться за резкость.
как приду с говноработы периодически испытываю загадочные эмоциональные "подъемы" на ровном месте...
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37501689
iljy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даете блин...,

бывает. Вы тоже извините если что
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609210
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - собирается инфа по каждой колесной паре данного поезда.
Спрашивается - зачем нужен суррогатный ключ в данном случае?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609372
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52У меня как раз такой случай - естественный кюч существует.
Не бывает таких случаев.

Massa52Через данный участок пути в одно и то же время может пройти только один поезд.
И совершенно случайно он проходит по этому участку в последнее воскресенье октября между двумя и тремя часами ночи.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609681
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerMassa52У меня как раз такой случай - естественный кюч существует.
Не бывает таких случаев.

Massa52Через данный участок пути в одно и то же время может пройти только один поезд.
И совершенно случайно он проходит по этому участку в последнее воскресенье октября между двумя и тремя часами ночи.

Это когда стрелки переводят? - так уже не переводят. И потом - есть UTC время. На крайняк - можно секуду подкинуть - чтоб не совпадало в последнее воскресенье октября. А если взять полное время - то уж точно совпадение в миллисекундах будет с ничтожной долей вероятности.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609731
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52Это когда стрелки переводят? - так уже не переводят. И потом - есть UTC время. На крайняк - можно секуду подкинуть - чтоб не совпадало в последнее воскресенье октября. А если взять полное время - то уж точно совпадение в миллисекундах будет с ничтожной долей вероятности.
Да, да. А Советский Союз выиграл Куликовскую битву . Делайте что хотите (напевая: "В морг, в морг, доктор сказал в морг и это значит в морг навсегда...")
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609744
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда приходится перепроцессивать поезда - при ошибочной калибрации например.
Тогда поезд при таких ключах разместится строго на том же месте по времени, а при использовании суррогатног ключа будет потеряна сортировка по времени. А так как основные запросы - это запросы во временном диапазоне - то по идее эти запросы должны отрабатываться быстрее - нежели по некластерному индексу.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609778
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэтому - усилия затраченные на отработку перевода стрелок один раз в год вполне окупаются выигрышем во времени отработки запросов.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609782
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уговаривайте, я так делать всё равно не буду. После того, как я провёл на работе десяток-другой-третий ночей, разгребая результаты сомнительных решений (в основном других программистов), я приобрёл устойчивую привычку программировать так, чтобы спокойно спать по ночам.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609806
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Да я не уговариваю - просто хотел сказать - что бывают случаи - когда можно и даже может быть нужно обойтись без суррогатных ключей, которые не несут никакой информативности, кроме фиксации уникальности записи. Правда нужно сознаться - что у меня в конторе никто моих взглядов не разделяет и сейчас у нас идет бодаловка - добавлять суррогантные ключи или нет. Вот и пришел на форум - чтобы послушать народ.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609834
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52, такие случаи бывают сугубо теоретически (в плохом значении слова "теория"). Потому что они перекрываются одним важным фактом: любые данные могут быть внесены с ошибкой. Например, ИНН уникален? Ну теоретически да. А потом появляется КПП. А ИНН физлица уникален? Вроде как да. Только бывает, что оператор вносил данные с листа с распечатанной таблицей и посмотрел не в ту строку - и в результате в базе у Петрова ИНН Сидорова. А потом Сидоров приходит, и совсем другой оператор в другом офисе не может его ввести - потому как ИНН "уникален". Время, говорите, уникально? А у меня в практике был случай, когда дата на сервере прыгнула в 2030-й год. Поэтому вопрос очень прост: мы либо программируем геморрой, либо не программируем геморрой. Я свой выбор сделал, и причины менять его вряд ли появятся.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609879
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

То что дата на компьютере прыгает - это факт. Еще есть и человеческий фактор - приходит чел на сайт - смотрит - а на компе время сбито(на самом деле там GMT) - ну он и переводит часы на локальное время. Время для поезда - очень важный фактор - и обычно на сайтах куча тулза синхронизации времени. Для того - чтобы бороться с неправильным временем - данные(RAW дата) закидываются параллельно в архив и процесснутые в SQL. Если чтот не то с данными - сбитое время или сбита каллибрация, то достаются RAW дата из архива и снова процессятся. Тут как бы соблюдение правильного времени - это правило. И суррогатный ключ в данном случае от неправильного времени не спасает. Он может спасти только при перекрытии времени - чтоб не накрылись старые данные. Но опять таки есть RAW дата - и все без проблем восстанавливается - так как даные каждый день просматриваются кучей операторов вагонов и если че не так - тут же кляуза - ну мы достаем RAW дата и вперед с песней. Диапазон то однодневный - там порядка 20 поездов. Кинул зип архив проге - та перемолотит и в SQL и там все опять тип-топ.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609892
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суррогатный ключ не спасает от неправильных данных. Суррогатный ключ спасает от большого геморроя при разгребании неправильных данных.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37609894
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

То что дата на компьютере прыгает - это факт. Еще есть и человеческий фактор - приходит чел на сайт - смотрит - а на компе время сбито(на самом деле там GMT) - ну он и переводит часы на локальное время. Время для поезда - очень важный фактор - и обычно на сайтах куча тулза синхронизации времени. Для того - чтобы бороться с неправильным временем - данные(RAW дата) закидываются параллельно в архив и процесснутые в SQL. Если чтот не то с данными - сбитое время или сбита каллибрация, то достаются RAW дата из архива и снова процессятся. Тут как бы соблюдение правильного времени - это правило. И суррогатный ключ в данном случае от неправильного времени не спасает. Он может спасти только при перекрытии времени - чтоб не накрылись старые данные. Но опять таки есть RAW дата - и все без проблем восстанавливается - так как даные каждый день просматриваются кучей операторов вагонов и если че не так - тут же кляуза - ну мы достаем RAW дата и вперед с песней. Диапазон то однодневный - там порядка 20 поездов. Кинул зип архив проге - та перемолотит и в SQL и там все опять тип-топ.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37610077
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Massa52
В огороде бузина, в Киеве дядька
Massa52 а при использовании суррогатног ключа будет потеряна сортировка по времениПочему?
Massa52 А так как основные запросы - это запросы во временном диапазоне - то по идее эти запросы должны отрабатываться быстрее - нежели по некластерному индексу.И чем этому помешал суррогатный ключ. Ваши затраты - на поддержание индекса.
Использование суррогатного первичного ключа совсем не запрещает использования альтернативных уникальных ключей. И кластеризовать по этому ключу тоже не обязательно. Это просто способ отличить одну запись от другой. Пусть пользователь "мамой клянется" что естественный ключ уникален, однако в военное время и по особому распоряжению уникальность может быть нарушена. А уж если на данную запись есть ссылки из других таблиц, то преимущества суррогатного ключа становятся полностью очевиднымыми.

softwarer Не бывает таких случаев.Поддерживаю. Вы можете не использовать суррогатный ключ, ваше право, но вы должны четко осознавать последствия: что будет если...
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37610182
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Таким образом, вопрос чисто технический: ввод внешнего суррогатного ключа - это
> всегда вытаскивание из базы родительской таблицы?

Тут у тебя всё понамешано, всё в кучу, 20 проблем в одном вопросе. Но
мне некогда, отвечу поэтому на главный вопрос и кратко:


0) (замечание) естественных ключей не бывает.

1) Как правило, во всех таблицах в реальных БД бывает 2 ключа:
внутренний, для СУБД (он -- PK) и ключ в терминах, доступных пользователю
(тогда он обычно оформляется как UNIQUE).
Второй ключ может в таблице отсутствовать в виде ключа, тогда это НЕУНИКАЛЬНЫЙ
набор полей из таблицы, который служит для визуальной идентификации записи
пользователем. Второй ключ также может быть уникальным с точки зрения
пользователей, но неуникальным в СУБД (нет уникального индекса).
Иногда для некоторых сущностей, например, сугубо служебных, второй ключ
может отсутствовать, тогда его роль выполняет первый, основной ключ.

2) каждый раз, когда тебе нужно ввести или найти какую-то дочернюю
запись (из дочерней таблицы), тебе нужно как-то задать ключ родительской
таблицы, это делается путём предъявления пользователю полей пользовательского
ключа (если его нет -- то всех полей таблицы) в виде списка для выбора.
Это обычно комбик или список.
Пользователь выбирает запись в этом списке и таким образом задаёт
значения полей PK родительской таблицы.

Т.о. ДА, это всегда вытаскивание из базы записей родительской таблицы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37610253
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52 а при использовании суррогатног ключа будет потеряна сортировка по времениПочему?
Потому что имеет место репроцесс данных. И тода физически - данные устаревшие по времени оказываются впереди(позади) свежих данных. И суррогатный ключ(на сегоднящний день их два типа) никак этому не воспрепятствует. Лучше уж тогда самому генерить суррогатный ключ из времени и сайта ID.
SERG1257И чем этому помешал суррогатный ключ. Ваши затраты - на поддержание индекса.
Использование суррогатного первичного ключа совсем не запрещает использования альтернативных уникальных ключей. И кластеризовать по этому ключу тоже не обязательно. Это просто способ отличить одну запись от другой. Пусть пользователь "мамой клянется" что естественный ключ уникален, однако в военное время и по особому распоряжению уникальность может быть нарушена. А уж если на данную запись есть ссылки из других таблиц, то преимущества суррогатного ключа становятся полностью очевиднымыми.

Алтернативный уникальный ключ не гарантирует последовательное физическое размещение данных. А основная работа с данными требует регулярного выдирания именно последовательно рассположенного куска данных и демонстрации пользователю.
softwarer Не бывает таких случаев.Поддерживаю. Вы можете не использовать суррогатный ключ, ваше право, но вы должны четко осознавать последствия: что будет если...
Что будет - что будет, а ничего не будет, вычеркним из списка и все(из анекдота).
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37610306
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
select * from Log_Train t, Log_Axle a where t.TrainTime=a.TrainTime and t.SiteID=a.SiteID


Громоздко, да?
Поэтому лучше сделать ключ, тогда:
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.
select * from Log_Train t, Log_Axle a where t.Log_TrainID=a.Log_TrainID



Уже лучше?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37610642
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11Massa52,

Теперь представь ситуацию, у тебя есть суррогатный ключ и прибегает этот-же менеджер.
Открываешь БД, смотришь, действительно, марта нету, однако записи 1001, 1002, 1003 относятся к февралю, 1004, 1005, 1006 уже к апрелю относятся. Показываешь всё это менеджеру и отправляешь его лесом выяснять, почему данные в марте не поступали. Ах, да, вспоминает он, там тогда КамАЗ перевернулся, а потом вообще рельсы бомжи спёрли.

В жизни все не так - после репроцессинга поездов 1004, 1005 1006 могут ваще к апрелю не относиться. После репроцессинга получается каша - так как репроцессинг означает - что берутся старые данные с новыми парамерами(например каллибрации - скажем заморозки - и платформа замерзла и чувствительность ценсоров повысилась - вес вагона из-за этого сильно подскочил) - надо срочно заново прогнать данные за февраль - а во дворе апрель - даже и такое бывает - данные за февраль снова обрабатывают - отчет за февраль не нравится менеджеру перевозок. В этом случае уж лучше генерить самому суррогатный ключ из времени и сайта. Алгоритм то простой - чуток сложнее - конечно чем добавлять единицу.


zeon11
Код: sql
1.
select * from Log_Train t, Log_Axle a where t.TrainTime=a.TrainTime and t.SiteID=a.SiteID


Громоздко, да?

Согласен - не эстетично - лишнее условие, которое будет постоянно сопровождать проект.
Но есть один бенефит - если мне нужны только колесные пары и я знаю время - то не нужно цеплять Log_Train. Но это слабо утешение.

Итак - поскольку данная предметная область позволяет легко генерить TrainID из TrainTime и SiteID - то мне кажется - это лучшее решение для генерации суррогатног ключа - нежели использование стандартных.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37610749
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52,

я уважаю твою настойчивость, но позволь мне мягко выразить свои сомнения.
1. Я вообще не уверен, что поле типа SmallDateTime подходит в качестве внешнего ключа, т.е. мне кажется, что связь между двумя таблицами не возможна (т.е. ты не сможешь их объединить SQL-запросом), или будет весьма "корявой".
2. Меня весьма настораживает твоё неоднократно сказанное слово "репроцессинг". Я так понял, что первоначальных данных, пришедших с датчиков уже давно нет? Их каждый раз перелопачивают-переписывают по прихоти менеджера, в зависоимости от температуры на улице? Если это так, то мне кажется, у вас в конторе всё очень плохо, так не должно быть.
Если хочешь знать, как стоило-бы сделать в подобной ситуации, то:
1. Данные с датчиков ОДИН раз записываются в БД, не зависимо от того, правильные они или кривые, мороз или жара, сломанный датчик или нет, - всё: пришли данные - записали.
2. В БД ведётся справочник датчиков и ведётся там-же временнОй журнал исправности датчиков с соответствующим коэффициентом, например, 33-й датчик в июне коэффициент 1.000 - данные датчика попадают менеджеру без измененний. Этот-же датчик в ноябре - коэффициент 0.786. Т.е. ты мысль мою понял? Первичные данные не трогаются, а если кто хочет похимичить с данными - пусть балуется с коэффициентами. И никакого "репроцессинга"
Удачи!
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37610797
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52И тода физически - данные устаревшие по времени оказываются впереди(позади) свежих данных....
Алтернативный уникальный ключ не гарантирует последовательное физическое размещение данных.

Меня всегда удивляло: почему в русском языке именно физике оказана такая честь, что слово "физически" означает "мамой клянусь, на самом деле так"? Почему категоричный отказ звучит "это физически невозможно", а не "химически", "биологически", "математически"?

Так вот: что, в Вашем представлении, есть "физическое" размещение данных в БД, почему оно важно, и как Вы собираетесь его использовать, что ему мешает дополнительный ключ?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37611074
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11,

С температурой я конечно промахнулся - это я ну чтоб как то объяснить причину репроцессинга. Но такая процедура довольно часто происходит при пуско-наладке системы - когда еще не все устаканено. И этот период иногда длится до года. Ну а в тех - в которых переходный процесс закончился - тоже бывают казусы - отказ ценсора. И есть куча процедур - как отлавливать динамически такую ситуацию - вплоть до мануального отключения ценсора. И это естественно иногда вызывает репоцессинг. Исходные данные никуда не деваются - а аккуратно зипуются и складываются в папочку archive недельными порциями. В случае репросессинга - достаешь такой архивчик и закидываешь в процедуре процессинга. Теперь о генерируемом "вручную" ключе - навскидку - конвертишь TrainTime в Hex строку и добавляешь Hex сайт - чем не ключ?

Fisher,

"Физическое" - я взял из объяснения - чем кластерный индех отличается от некластерного. Из того что основная масса запросов для репортов и ваще идет по непрерывному отрезку времени. За прошлый месяц, год, день, топ 20 плохих вагонов за прошедший месяц и все в таком роде. Ясень пень - кластерный индех лучше. Теперь - как протекает сам процесс - Прошел поезд - данные сформировались и поступили на обработку - отработал "INSERT" и данные в SQL - до следующего поезда можно перекурить. А вот когда пользователи, сидя за монитором в ожидании выборки, нервно курят - тут однозначно желательно все продумать про оптимизацию "SELECTа" в мелочах - чтоб сберечь нервы юзеру.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37611121
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52"Физическое" - я взял из объяснения - чем кластерный индех отличается от некластерного.а вы умеете кластерный индекс делать только по первичному ключу, штоле?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37612284
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут уже обсуждался кластерный индекс по дате:
Кластерный индех
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37612590
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52Тут уже обсуждался кластерный индекс по дате:
Кластерный индеха у вас одноцэ, разве, чтобы на этот топик ссылаться? иначе не понятно, зачем вы привели его в пример
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37613621
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения egorych,
Топик я привел - увидел там чтот подобное тому, что я пытаюсь делать.
Я не догнал вашу идею.
Если скажем - я делаю первичный суррогатный ключ и делаю его некластерным.
Потом строю кластерный индех по TrainTime.
Вы это имели ввиду чвоим вопросом?
Что тогда? Запросы с select * From ... WHERE BETWEEN TrainTime > AND TrainTime <
будут летать?
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37613641
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52Что тогда? Запросы с select * From ... WHERE BETWEEN TrainTime > AND TrainTime < будут летать?

Вообще-то они будут летать при любом типе индекса, не только кластерном...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37614766
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52Если скажем - я делаю первичный суррогатный ключ и делаю его некластерным.
Потом строю кластерный индех по TrainTime.по TrainTime DESC + SiteID ASC, тогда
Massa52Запросы с select * From ... WHERE BETWEEN TrainTime > AND TrainTime < будут летать с той же скоростью, как и с вашим естественным ключём по этим полям
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37614939
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Спасибо. Я как то упустил этот вариант. Сейчас проект только разворачивается - как только начнется работа с данными - построю обе структуры и протестирую на ключевых SELECT.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37614955
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Не уверен. Как я представляю ситуацию с кластерным и некластерным индексом - это как отоваривание в супермаркете. Когда с кластерным - ты приходишь в супермаркет - а там уже все разложено по тележкам(это конечно в идеале) - взял тележку под нужным номером и покатил. А с некластерным - это значит с запиской от жены - купи это, это и еще не забудь ... то.
...
Рейтинг: 0 / 0
Теоретический вопрос по первичным ключам
    #37615076
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52Как я представляю ситуацию с кластерным и некластерным индексом

Как-то ты хреново её представляешь... Нет, может у MS так и есть, конечно... Ну так в мире
есть куча гораздо лучших СУБД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
59 сообщений из 59, показаны все 3 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Теоретический вопрос по первичным ключам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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