powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Отказ от составного первичного ключа.
55 сообщений из 55, показаны все 3 страниц
Отказ от составного первичного ключа.
    #40065928
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Подскажите пожлуйста, у меня есть поля.
airline_icao_code
airline_name
airline_call_sign
country_ID.
Первые три поля уникальны. По идее они прекрасно подходят для составного первичного ключа, однако этот же весь составной первичный ключ должен мигрировать в другие таблицы, я хочу избежать множество join в select. Могу ли я добавить сурогатный id, а первые три поля сделать уникальными? Не нарушвет ли это нормализацию?
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065930
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13По идее они прекрасно подходят для составного первичного ключа

Это плохая идея. Они даже для уникального ключа не подходят. И да, суррогатный первичный
ключ на нормализацию никак не влияет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065931
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, То есть сурогатный с ограничением уникальности на три поля неплохое решение, как я понял?
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065932
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вот один вопрос такой. Как сделать ограничение на то, чтобы поле содержала только верхний регистр?
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065937
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13неплохое решение

"Неплохость" решения зависит от его соответствия задаче. Нет задачи - нет оценки решения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065940
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, задача стоит в том, чтобы нормализовать БД. Набор из первых строк представляет собой уникальную идентификацию аэропорта, например
GRO
Grodno airline
GRODNO AIRLINE соответсвуют только одной авиакомпании по ICAO код, поэтому я и подумал, что эти три поля пододйдут для первичного ключа, но PK этой таблицу мигрирует в Полеты, и я не хочу мигрировать такой составной ключ в Полеты, вот и спросил про сурогатный ключ. Мне кажется, что поле страна айти тогда будет зависимть не только от сурогатного, но и от трех остальных полей. Очень надеюясь, что я понятно изложил суть своей проблемы
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065941
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13,

у палки 2 конца
1. миграция
2. лукапы
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065943
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13адача стоит в том, чтобы нормализовать БД.

"Неплохость" решения учебной задачи определяется исключительно преподавателем, её задавшим.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065946
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял то, что лучшего варианта нету, все зависит от задачи. Останавлюсь на сурогатном ключе, чтобы потом не делать три джойна на только на аодну табоицу. Спасибо всем
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065952
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
GRODNO AIRLINE соответсвуют только одной авиакомпании по ICAO код , поэтому я и подумал, что эти три поля пододйдут для первичного ключа

Тогда у тебя тут налицо ФЗ левая сторона которой не является ключом, т.е. нарушение как минимум НФБК.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065955
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, вылетелело из головы ФНБК, если рассматривать составной ключ, тогда больше склоняюсь с сурогатному и ограничению по уникальности, чтобы не декомпозировать отношение. Спасибо
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065958
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
тогда больше склоняюсь с сурогатному и ограничению по уникальности, чтобы не декомпозировать отношение.

Декомпозировать все равно придется, потому что у тебя будет транзитивная ФЗ: ID -> Код ИКАО -> Авиакомпания. Нарушится 3 НФ.

НФБК похожа на 3 НФ, но немного "нормальнее" и определение проще: "Левая часть любой неприводимой и нетривиальной ФЗ должна быть ключом".
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065969
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
Добрый день. Подскажите пожлуйста, у меня есть поля.
airline_icao_code
airline_name
airline_call_sign
country_ID.
Первые три поля уникальны. По идее они прекрасно подходят для составного первичного ключа, однако этот же весь составной первичный ключ должен мигрировать в другие таблицы, я хочу избежать множество join в select. Могу ли я добавить сурогатный id, а первые три поля сделать уникальными? Не нарушвет ли это нормализацию?


Да, можешь. Нет, не нарушит.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065971
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, мне сообщением выше написали, что это нарушает 3НФ, хотя я думал, что нет, так как каждое поле зависит от сурагатного. Как вариант, я могу разбить все же на две сущности airline_icao_code => airline_name и airline_icao_code => airline_call_sign, country_ID
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065973
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя делать связь 1 к 1 тоже не хочется, лишний джойн во время запроса
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065979
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, airline_icao_code => airline_name и airline_icao_code => airline_call_sign, country_ID со связью 1 к 1?
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065980
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
Как вариант, я могу разбить все же на две сущности airline_icao_code => airline_name и airline_icao_code => airline_call_sign, country_ID

Вообще, насколько я понимаю смысл полей тебе стоит просто добавить ключ ID и объявить альтернативным ключом (UNIQUE) airline_icao_code. А то и просто ничего не добавлять, а сделать airline_icao_code ключом из одного поля. Как-то так (если на MS SQL):
Код: sql
1.
2.
3.
4.
5.
create table ttt (
  airline_icao_code nvarchar(50) not null primary key,
  airline_name nvarchar(50) not null,
  airline_call_sign nvarchar(50) not null,
  country_ID int not null foreign key reference countries(ID)


или с суррогатом:
Код: sql
1.
2.
3.
4.
5.
6.
create table ttt (
  id int not null identity(1,1)  primary key
  airline_icao_code nvarchar(50) not null unique,
  airline_name nvarchar(50) not null,
  airline_call_sign nvarchar(50) not null,
  country_ID int not null foreign key reference countries(ID)


Можно, в принципе, еще поля name и sign сделать по отдельности уникальными, если это так.

Лично мне с суррогатом нравится намного больше, но в данном случае это скорее дело вкуса.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065989
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, исходя из данных airline_call_sign тоже уникальный. По идее он тоже может быть альтернативным первичным ключом. Так как как и код и название он уникально идентифицирует афиакомпанию. Если рассматривать такой вариант, то я бы выбрал без сурогатного. Так как пусть имя и airline_call_sign так же уникально идентифицируют авиакомпанию, но по сути оба зависят от кода.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065992
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, по отдельности я не могу сделать эти поля, может быть только такой вариант для идентификации одной компании 'GRO', 'Grodno','Grodno_comp', других вариантов быть никак не может по стандарту. Каждое из этих полей может быть альтернативным первичным ключом
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40065998
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, получается три альтернативных ключа. Но ограничение уникальности должно быть на 3 поля. От кода точно зависит имя, да и сигн, но они могут быть альтеративными первичными ключами. Что-то я совсем запутался
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066011
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, неправильно понял про уникальность на каждое поле, да, такой вариант правильнее, но id_ страны зависит не только от id авиакомпании.

Я думаю над таким варинатом решение

create table ttt (
airline_icao_code nvarchar(50) primary key,
airline_name nvarchar(50) not null unique,
airline_call_sign nvarchar(50) not null unique
);

create table tt (
airline_icao_code nvarchar(50) primary key,
country_ID int not null foreign key reference countries(ID)
);
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066020
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
но id_ страны зависит не только от id авиакомпании.

Но, если
Moneta13
create table tt (
airline_icao_code nvarchar(50) primary key,
country_ID int not null foreign key reference countries(ID)
);

то ИД страны как-раз таки зависит именно от ИД компании.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066024
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, я наверное плохо выражаю свои мысли. Если все сделать в одном отношении, то первые три поля уникальны, и айди страны может зависеть от любого из этих полей. Но, когда я разбил на два отношения, то для себя уже выделил первичный ключ из двух альтернативных, и уже во втором отношении айди страны зависит только от первичного ключа. Может я не понимаю что или усложняю
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066025
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
От кода точно зависит имя, да и сигн, но они могут быть альтеративными первичными ключами. Что-то я совсем запутался

А в чем путаница-то? У сущности запросто может быть не один ключ (то, что называется "потенциальные ключи"). Объявление одного из них "primary" это, скорее, просто традиция (в сиквеле он не может быть null и по умолчанию создается в виде кластерного индекса - больше он, фактически, ничем от любого другого unique не отличается).
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066027
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, путаница в айти страны и зависимости ее как от первичного так и от альтернативного ключа
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066030
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
и айди страны может зависеть от любого из этих полей.

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

Само по себе определение ФЗ такое:

(X, Y, ....) -> Z

значит что для любых двух записей у которых одинаковые наборы (X, Y, ...) будет одинаков и Z.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066033
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, я вроде как разобрался. Пробелы в теории, додумался только сейчас погуглить. неключевой атрибут может спокойно зависеть от первичного ключа и от альтернативных
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066037
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, вроде бы разобрался, путаница в пробеле по теории соображением погуглить только сейчас. Неключевой атрибут может зависеть как от первичного, так и от альтернативного. Тогда путаница сразу спадает
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066038
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, спасибо большое
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066042
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
неключевой атрибут может спокойно зависеть от первичного ключа и от альтернативных

Так не просто "может", а "обязательно будет". Вопрос нормализации сводится к тому не будет ли он при этом зависеть еще и от других неключевых аттрибутов.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066047
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, да, понял, сталкивался с ситуациями, когда только один ПК, без потенциальных, вот как то и не задумывался об зависимости от потенциальных ключей. Жил по определени. 3НФ от хабра до этого
Отношение находится в 3НФ, когда находится во 2НФ и каждый не ключевой атрибут нетранзитивно зависит от первичного ключа.
Спасибо большое
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066062
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
Спасибо большое


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

Выбросьте эту идею нафиг.

Moneta13
однако этот же весь составной первичный ключ должен мигрировать в другие таблицы

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

Moneta13
Могу ли я добавить сурогатный id

Скорее, "должны". Вообще, "добавить суррогатный id" - это в 99% случаях абсолютно правильная идея, а в оставшемся 1% случаев - "неплохая и вполне приемлемая идея".

Moneta13
а первые три поля сделать уникальными?

Меня немного смущает такая постановка вопроса. Неужели у ИКАО в самом деле могут быть одинаковые комбинации кода и позывного, отличающиеся только названием? Мне кажется, здесь Вам нужно присмотреться получше.

Moneta13
Не нарушвет ли это нормализацию?

Нет. Зато это избавляет от уймы геморроя, особенно когда окажется, что какая-нибудь авиакомпания сменила название (что происходит весьма регулярно).
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066169
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Вообще, "добавить суррогатный id" - это в 99% случаях абсолютно правильная идея

Я бы сказал, что в 100. Часто еще не берут во внимание тот факт, что при заполнении какого-то поля (например СНИЛС) может быть ошибка (девочка-оператор не на ту кнопку нажала), и если этот, например, СНИЛС используется как естественный PK вместо суррогатного, то исправление этой ошибки в БД позже может вылиться в адов гемморой, когда эта опечатка растечется еще по дюжине таблиц в виде FK.

Речь, впрочем, не идет о таблицах типа много-ко-многим, типа {UserId, RoleId} - тут ключ хоть и составной, но по сути, тоже суррогатный, т.к. состоит ведь из "суррогатных" аттрибутов.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066171
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneta13
Жил по определени. 3НФ от хабра до этого

В общем-то определение НФБК проще и не зависит от 2НФ. И ситуация, когда отношение в 3НФ но не в НФБК весьма экзотичная - я так сходу и придумать пример не смогу. Насколько я помню, для этого нужно наличие как минимум двух составных ключей, которые при этом еще и пересекаются по аттрибутам.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066173
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
в которой составные первичные ключи доходили до 12 полей

По-моему для фактов в Star/Snowflake это может быть вполне нормально. Впрочем, если тут специалисты по OLAP есть, они точнее смогут сказать.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066294
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Moneta13
Жил по определени. 3НФ от хабра до этого

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

НФБК: отношение находится в 3НФ и каждый детерминант ФЗ является потенциальным ключом.
Вот пример:
Сессия(НомерЗачКнижки, КодСтудента, Дисциплина, Дата, Оценка)
Потенциальные ключи:
НомерЗачКнижки+Дисциплина+Дата
КодСтудента+Дисциплина+Дата

ФЗ:
НомерЗачКнижки+Дисциплина+Дата->Оценка
КодСтудента+Дисциплина+Дата->Оценка
НомерЗачКнижки->КодСтудента
КодСтудента->НомерЗачКнижки

Есть два детерминанта, которые не являются потенциальными ключами.
1 возможная декомпозиция:
С2( КодСтудента, Дисциплина, Дата , Оценка)
С3(НомерЗачКнижки, КодСтудента)

2 возможная декомпозиция:
С2( НомерЗачКнижки, Дисциплина, Дата , Оценка)
С3(НомерЗачКнижки, КодСтудента)
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066301
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИВП
Вот пример:
Сессия(НомерЗачКнижки, КодСтудента, Дисциплина, Дата, Оценка)
Потенциальные ключи:
НомерЗачКнижки+Дисциплина+Дата
КодСтудента+Дисциплина+Дата

По-моему это будет нарушать даже 2НФ. Есть ФЗ КодСтудента+Дисциплина+Дата -> НомерЗачКнижки которая является приводимой , что, как раз, условия 2НФ нарушает.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066379
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
ИВП
Вот пример:
Сессия(НомерЗачКнижки, КодСтудента, Дисциплина, Дата, Оценка)
Потенциальные ключи:
НомерЗачКнижки+Дисциплина+Дата
КодСтудента+Дисциплина+Дата

По-моему это будет нарушать даже 2НФ. Есть ФЗ КодСтудента+Дисциплина+Дата -> НомерЗачКнижки которая является приводимой , что, как раз, условия 2НФ нарушает.

Что значит "приводимой"? Приводимой к чему? или приводимой куда?
Для 2НФ требуется отсутствие зависимостей неключевых атрибутов от частей составного ключа.

От каждой из частей ключа НомерЗачКнижки, Дисциплина, Дата ни один НЕКЛЮЧЕВОЙ атрибут не зависит.
ФЗ КодСтудента+Дисциплина+Дата -> НомерЗачКнижки - зависимость ЧАСТИ ключа от составного ключа. Поэтому и есть нарушение НФБК.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066428
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИВП
Что значит "приводимой"? Приводимой к чему? или приводимой куда?

Ты не знаешь что такое "приводимая ФЗ"? Так загляни в учебник.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40066429
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИВП
Для 2НФ требуется отсутствие зависимостей неключевых атрибутов от частей составного ключа.

Впрочем, ты сам же и сказал. Приводимая ФЗ, это из левой части которой можно выкинуть часть атрибутов не нарушая её.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070710
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А разве ICAO сам по себе не годится на роль натурального PK? Уникальный, короткий.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070713
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Главная проблема в натуральных ключах типа ICAO это то, что вы их не контролируете. Периодически они могут меняться, и если вы, в порыве безудержного оптимизма, сделали FK-ссылку на такой ключ, то ваши варианты либо on update cascade (что не всегда возможно), либо тонны геморроя каждый раз, когда такое случается.

Объявить код ICAO альтернативным ключом - да, безусловно. Делать его первичным - я бы не рискнул. Ну или если реально невтерпеж, то (в зависимости от СУБД, наверное - за все не скажу) FK может ссылаться на AK вместо PK.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070778
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael
НеофитSQL,

Главная проблема в натуральных ключах типа ICAO это то, что вы их не контролируете. Периодически они могут меняться, и если вы, в порыве безудержного оптимизма, сделали FK-ссылку на такой ключ, то ваши варианты либо on update cascade (что не всегда возможно), либо тонны геморроя каждый раз, когда такое случается.

Объявить код ICAO альтернативным ключом - да, безусловно. Делать его первичным - я бы не рискнул. Ну или если реально невтерпеж, то (в зависимости от СУБД, наверное - за все не скажу) FK может ссылаться на AK вместо PK.


Изменение кодов ICAO повело бы к огромным неудобствам, поскольку они были придуманы как ключи, и с ними уже обращаются как с ключами (не только в БД, а в более широком смысле). Они не используютсе повторно.

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

В чем состоит проблема внешнего контроля PK организацией? Возьмем например коды стран: допустим РФ по какой-то загадочной причине решит называться вместо "ru" - "rf". Подав петицию, после долгого период международного обсуждения, и при условии положительного решения, будет многомесячный, или даже многолетний период перехода. За это время мне придется добавить новую строку в таблицу стран, "rf, Russia", и обновить ссылки ru->rf. После чего пометить "ru" как удаленную и добавить сторожевой код на предмет попыток использования недействительного исторического ключа.

Звучит довольно несложно на мой взгляд не особо обремененный опытом проектирования БД.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070797
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
В чем состоит проблема внешнего контроля PK организацией?

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

Как пример. Согласно законодательству РФ, зарплаты должны выплачиваться в рублях и только в рублях. Можно предполагать, что ряд программных решений соответствует этому требованию. А теперь представим себе, что взяла и повторилась весёлая пляска с российским рублём RUR (код 810) и российским рублём RUB (код 643). Я своими глазами наблюдал, как в примерно подобном случае большая команда (> 60 человек) порядка трёх месяцев сидела на работе ночами и выходными, практически забросив все другие задачи и занимаясь только исправлением в системе всего, что затронула такая "проблема".
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070946
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подробный ответ.

Я сам не могу оценить риск такого решения, но проникся что вы настоятельно советуете против такого подхода.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070948
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

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

Чаще бывает несколько иная ситуация, когда в систему нужно добавить новое измерение, и учесть его везде, где только можно. У меня, например, был случай, когда в работающей системе надо было реализовать мультивалютность. До этого в ней были только рубли, и даже мысли ни у кого не возникало, что понадобится что-то еще. Справочник валют, конечно же, был, но из кода к нему не было обращений - зачем, ведь там всего одна строчка, и мы все знаем, какая именно. В результате я потратил изрядное количество времени, добавляя параметр @CurrencyId в куче мест и одновременно вычищая код вида
Код: sql
1.
2.
3.
4.
select *
from dbo.Table t
where t.RefId = @Id
  and t.CurrencyCode = 'RUR';


Это не совсем то же самое, но причины те же и объем геморроя вполне сопоставим.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070954
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне это чем-то напомнило реакцию молодых программистов когда речь заходит о временных поясах, или локализации. В России то все компы двуязычные, народ худо бедно в кодировках шарит.

Может тут дело ещё и не в ключе, а в монокультуре которая накладывает невидимые ограничения и стреножит мозг.

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

С другой стороны, я бы лучше увидел != "'EUR" в коде чем
...!= 3 -- '3' это евро. Везде пишем троечку
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070955
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Попробуйте, конечно, кто ж запрещает. Потом нам расскажете.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40070999
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
С другой стороны, я бы лучше увидел != "'EUR" в коде чем ...!= 3 -- '3' это евро. Везде пишем троечку
Hardcoded-значения из "внешнего" мира часто создают разнообразные проблемы, в первую очередь из-за упомянутой неоднократно отсутствии гарантии, что они не изменятся в любой момент. Теоретических ограничений на их использование нет, так же как и на естественные ключи при проектировании БД, но практика показывает, что лучше использовать суррогатные ключи. И да, вполне можно использовать составные ключи, если они состоят из суррогатных же, при аггрегирующих запросах можно получить неплохой профит.
С натуральными кажется проще, но до первого столкновения с изменчивостью мира. Суррогатные ключи обычно и компактнее, и сравниваются быстрее, сравнивать строки сильно дороже, чем целые числа.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40071187
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot ChA#22323507]
НеофитSQL

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


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


По поводу компактности и скорости я был удивлен когда начал изучать SQL в прошлом году что в Оракле база данных не поддерживает хранение целых чисел, а за целые числа выдаются числа с плавающей точкой и переменной длины мантиссы (!!!!). У них длина в первом байте где-то.

Насколько я помню ассемблер, такие числа сравнивать то же самое, что паскальные строки.

После пары-тройки таких сюрпризов, я перестал полагаться на свой не-SQL опыт и предпочитаю эксперименты умозаключениям чтобы улучшить чуйку в этой области.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40071646
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут всё просто:

- всегда (при возможности) использовать суррогатный ключ, если задачи реальные.

- всегда использовать то, что требует преподаватель, если задачи учебные.

и не ошибётесь :)
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40071651
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарьвсегда (при возможности) использовать суррогатный ключ

А вот отсюда поподробнее, пожалуйста. О случаях невозможности использования суррогатного
ключа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40071655
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Кесарьвсегда (при возможности) использовать суррогатный ключ

А вот отсюда поподробнее, пожалуйста. О случаях невозможности использования суррогатного
ключа.


Ну это я погорячился.
...
Рейтинг: 0 / 0
Отказ от составного первичного ключа.
    #40071752
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Кесарьвсегда (при возможности) использовать суррогатный ключ

А вот отсюда поподробнее, пожалуйста. О случаях невозможности использования суррогатного
ключа.

а когда данные не уникальны?
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Отказ от составного первичного ключа.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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