|
|
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
Есть некая таблица B, которая ссылается на другую таблицу A (с первичным ключем) с помощью внешнего ключа. Вопрос нужен ли в таблице B первичный ключ (искусственный, типа автогенератора) если записи в таблице B не имеют смысла и не существуют без наличия соотв. записи в таблице А (связь А:1 к B:N, где N = 0, 1, 2, ... ). Я считаю что искусственный первичный ключ в B вроде бы как и не к чему. Тем более что с практической т.з. выборка записей из B будет производится только на основании записей из А, и некоторого значения поля в B. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 10:35 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
А как ты будешь удалять одну запись из В??? По какому признаку?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 10:37 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
PK нужен обязательно. некоторые СУБД без первичного ключа не могут нормально обрабатывать таблицы, а некоторые просто создают внутренний ключ. и не факт, что он будет работать лучше, чем созданный программистом со знанием дела. Все ИМХО. ---- SAnalis.ru - Just for fun. Еще расту, а так я ДЖИП! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 11:06 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
Поставь fk, непонятно в чем вопрос? если сервер БД не поддрживает fk - это уже другое. VoDAнекоторые СУБД без первичного ключа не могут нормально обрабатывать таблицы, а некоторые просто создают внутренний ключ. и не факт, что он будет работать лучше, чем созданный программистом со знанием дела. Хочу поинтересоваться насчет некоторых субд, кторые создают внутренний ключ - это как? по какому признаку он создает? если есть таблицы, в них поля... ну и что из этого? если не заданы правила - так что он может такое создавать, - а скорее всего ничего.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 11:14 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
AndronВопрос нужен ли в таблице B первичный ключ (искусственный, типа автогенератора) .... (связь А:1 к B:N, где N = 0, 1, 2, ... ) Давайте смотреть. Связь - не один к одному, то есть значение FK (ключ A) не может быть ключом в B. Реляционная теория исходит из предположения, что записи в B не могут полностью совпадать, то есть кандидат в PK таки есть (может быть, комбинация всех полей B). Таким ключом пользоваться не очень удобно, поэтому рекомендуется его замена на суррогатный. Практически - если задача такова, что ключ этой таблицы нигде никогда не пригодится, делать его особо незачем. Если пригодится, для того уже "удаления одной записи" - однозначно делайте. В принципе можно сделать и просто "для единообразия", скорее всего несложно и нестрашно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 11:41 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
PK нужен всегда. Это может быть композитный PK (в случае связующих таблиц для отношения м-м или какогов случае -то куба данных). Это может быть по-совместительству FK. Но так или иначе PK нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 11:57 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
iamherePK нужен всегда. Докажете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 12:35 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
softwarer iamherePK нужен всегда. Докажете?Это аксиома - элементы множества должны быть различимы. Зачем в модель вводить сущность, экземпляры которой неразличимы ? IMHO, то, что во многих современных СУБД существует возможность при создании таблиц не указывать PK - большая ошибка, и является постоянным источником ошибок для некоторых начинающих проектировщиков. Понятно, что СУБД на физическом уровне может отличить записи по физическому адресу, но РМД не может оперировать этим различием, так как не оперирует упомянутыми адресами в каком бы то ни было виде, тем более, что они не имеют ни малейшего смысла в контексте предметной области. При общем отказе от обязательности нормального PK, определенного на множестве атрибутов, некоторые производители ввели искуственный системный идентификатор, который позволяет оперировать конкретными записями. К сожалению, это дает повод утверждать, что PK необязателен, с чем трудно согласиться, так как упомянутый идентификатор фактически играет роль PK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 01:57 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
Это аксиома Я бы скорее назвал то, что Вы имеете в виду, постулатом. - элементы множества должны быть различимы. Согласен. А зачем для этого PK? IMHO, то, что во многих современных СУБД существует возможность при создании таблиц не указывать PK - большая ошибка, .... У меня такое ощущение, что Вы смешали в одну кучу логику и физику. Чуть позже отвечу собственно на эту фразу, сейчас - ответы на прочее сказанное Вами. Это, кстати, не означает, что я как-либо защищаю ту позицию, которую, похоже, Вы атакуете. 1. Все, что Вы сказали относительно "физического адреса записи", столь же относится к автоинкрементным полям и прочим вариантам суррогатного ключа. СУБД имеет одинаковые возможности манипулирования тем и другим, они равно бессмысленны с точки зрения предметной области - короче говоря, с точностью до технических деталей они полностью взаимозаменяемы. 2. Вы совершенно зря полагаете, что в любой системе необходим идентификатор записи. Тривиальный пример задачи - какая-нибудь лента биржевых котировок с операциями типа - Добавить (Кто, Когда, Сколько) - Показать (Кто, ОтКогда, ДоКогда) - ОчиститьСтарое (РанееЧем) Записи в такой системе различимы, ПК - нафиг не нужен. 3. Наконец, по поводу "большой ошибки". Тут необходим некоторый философский экскурс, так что я не удивлюсь и не обижусь, если будет лень читать. Довольно много начинающих проектировщиков исходят из принципа "запретить все что можно". Некоторые, к сожалению, сохраняют приверженность этому принципу, синдрому вахтера, даже утратив статус начинающих. Мне здесь опять-таки повезло с первой работой - когда я сотворил примерно следующую пару функций (разумеется, код условный - чтобы показать принцип) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. мои коллеги очень хорошо объяснили, что вроде бы все правильно, но вот пользоваться этим будет неудобно; если же разрешить пару вещей - в ответ на mygetmem (0) возвращать NULL, а при myfreemem (&NULL) просто ничего не делать - код, который пользуется этими функциями, станет надежнее, короче и понятнее. Ваша "большая ошибка" - как раз из принципа "все запретить". Допустим, у меня есть таблица из N полей, различимая по этим N полям. Ваш "обязательный PK" дает следующее богатство вариантов: 1. Ввести поле суррогатного ключа. Это поле не будет использовано нигде и никогда в системе. 2. Уменьшить скорость вставки в таблицу в два с лишним раза и во столько же увеличить занимаемое на диске место, создав PK на все поля и соответствующий ему индекс. 3. Создать PK без индекса; место не теряется, но вставка будет идти неимоверно долго (вызывать full scan по таблице). Хм... что-то мне кажется, что из этих вариантов "большая ошибка" - один из лучших :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 12:10 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
AndronЕсть некая таблица B, которая ссылается на другую таблицу A (с первичным ключем) с помощью внешнего ключа. Вопрос нужен ли в таблице B первичный ключ (искусственный, типа автогенератора) если записи в таблице B не имеют смысла и не существуют без наличия соотв. записи в таблице А (связь А:1 к B:N, где N = 0, 1, 2, ... ). Если на таблицу B не будет ссылок из других таблиц, то сурогатный ключ точно не нужен. Если ссылки есть, то все сложнее - надо понять, насколько сущность таблицы В носит самостоятельный характер. И насколько удобно будет работать с этой таблицей (вводя суррогатный ключ удобство несколько повышается, но объем данных в таблице увеличивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 12:57 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
softwarerВы смешали в одну кучу логику и физику.Боюсь, что с точностью до наоборот... softwarer1. Все, что Вы сказали относительно "физического адреса записи", столь же относится к автоинкрементным полям и прочим вариантам суррогатного ключа. СУБД имеет одинаковые возможности манипулирования тем и другим, они равно бессмысленны с точки зрения предметной области - короче говоря, с точностью до технических деталей они полностью взаимозаменяемы.Ничего подобного, физический адрес может постоянно меняться, например, при расщеплении страниц данных, тогда как логический, на множестве атрибутов, пусть даже суррогатных, никогда. Относительно предметной области, сожалею, не указал, что под ней подразумевается ее модель с точки зрения проектировщика, а не с точки зрения ее пользователя. Мы ведь не на сайте бухгалтеров, для которого понятие PK отсутствует за ненадобностью, хотя может иметь смысл номер операции или проводки. softwarer2. Вы совершенно зря полагаете, что в любой системе необходим идентификатор записи. Тривиальный пример задачи - какая-нибудь лента биржевых котировок с операциями типа - Добавить (Кто, Когда, Сколько) - Показать (Кто, ОтКогда, ДоКогда) - ОчиститьСтарое (РанееЧем) Записи в такой системе различимы, ПК - нафиг не нужен.Здесь имеем расхождение в понимании PK. Для Вас это, скорее, физика, для меня - логика. Если существует однозначный и неизменный набор атрибутов, который позволяет отличить один кортеж от другого, то его уже можно смело считать PK, в независимости от того, указал ли его проектировщик соответствующим видом ограничения или нет. Если такого набора не будет, то нарушается, как Вы выразились, постулат различимости. softwarerДопустим, у меня есть таблица из N полей, различимая по этим N полям. ... 1. Ввести поле суррогатного ключа. Это поле не будет использовано нигде и никогда в системе. Значит, PK состоит из N полей и нет необходимости вводить дополнительный ключ. softwarer 2... ... 3... мне кажется, что из этих вариантов "большая ошибка" - один из лучших :))Физика - плата за несовершенство мира, модель предметной области не нуждается в понятии индексов, только в ограничениях, и как они реализованы к проектированию упомянутой модели совершенно не относиться. В любом случае, IMHO, физика не может являться доказательством ненужности PK и поводом для отказа от него, так как PK, в первую очередь, понятие логическое. P.S. Кстати, те же суррогатные атрибуты в качестве ключей чаще всего дань той самой физике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 16:34 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
Ничего подобного, физический адрес может постоянно меняться, например, при расщеплении страниц данных, тогда как логический, на множестве атрибутов, пусть даже суррогатных, никогда. А кто сказал, что он обязан меняться? Здесь имеем расхождение в понимании PK. Для Вас это, скорее, физика, для меня - логика. О чем я и сказал изначально. Для меня PK - логика + физика. Вы говорите с позиции чистой логики, обобщая ее на физику. Если существует однозначный и неизменный набор атрибутов, который позволяет отличить один кортеж от другого, то его уже можно смело считать PK Ну, считать PK его на самом деле нельзя, но это отдельный вопрос, который предлагаю не обсуждать. Если говорить о сугубо логическом ПК, то та фраза, на которую я возразил - "ПК всегда нужен" - не имеет смысла. Почему: потому что ПК в данном отношении либо объективно существует либо объективно не существует. Во втором случае отношение не соответствует реляционной теории, и ничего с этим в общем-то не сделаешь; осталось только понять, зачем такое может понадобиться. Сформулирую утверждение, которое, полагаю, возможно строго доказать: введение суррогатного ключа не меняет функциональные возможности модели данных, не способно ввести ни одной осмысленной операции, невозможной при отсутствии такого ключа. Бессмысленные операции - может добавить, но кому они нужны? Теперь давайте посмотрим на изначальный вопрос. Есть структура данных, которая решает свои задачи. Полагаю, в таблице B есть такой вот "кандидат в ПК", но это вообще говоря не важно. Andron спросил: нужно ли вводить суррогатный ключ. С логической точки зрения в этом случае нет никакой разницы - поскольку это не добавит осмысленных операций. Следовательно, разница если и есть, то в физике. Соответственно, фраза "ПК всегда нужен" может быть понята двояко: либо, более разумно, "физический ПК всегда нужен", либо, менее разумно "все равно давай введем второй логический ключ к тому, что и так есть, либо первый, если на самом деле такого нет". Именно на эту фразу я отвечаю. Честно говоря, по этой причине я изначально хотел вставить комментарий типа "хочу ответа от автора и прошу других не отвечать" - как раз потому, что ожидал ухода в сторону чистой логики. , в независимости от того, указал ли его проектировщик соответствующим видом ограничения или нет. Если такого набора не будет, то нарушается, как Вы выразились, постулат различимости. Если такого набора нет в значащих данных, суррогатный ключ ничуть не улучшит ситуации. Рассмотрите два набора данных: ВасяПетяМашаСветаВася и 1Вася2Петя3Маша4Света5Вася Покажете ли Вы хоть одну операцию, в которой второй набор чем-то лучше первого при сохранении суррогатности ключа (то есть, грубо говоря, пользователь нигде и никогда не оперирует значением id)? Физика - плата за несовершенство мира Хм. На эту тему есть хороший старый анекдот: http://economtaxi.ru/forum/viewtopic.php?p=486 В любом случае, IMHO, физика не может являться доказательством ненужности PK и поводом для отказа от него, так как PK, в первую очередь, понятие логическое. С точки зрения логики все просто - ПК либо есть, либо нет. Если нужно работать с данными, в которых его нет - надо отказаться от реляционной теории и придумать какую-либо другую, которая покрывает эту область. Кстати, те же суррогатные атрибуты в качестве ключей чаще всего дань той самой физике. Они дань тому, что программирование - инженерная дисциплина, а не гуманитарная. Наша цель - решать задачи, а не строить карточные домики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 21:55 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
Небольшое замечание. Суррогатные ключи несут информацию для пользователя, даже если пользователь нигде и никогда не оперирует значением id Наборы данных: ИДИмя1 2 3 4 5 и ИДИмя100 200 300 400 500 абсолютно одинаковы по информации : существует 5 каких-то разных людей, имена которых неизвестны. При этом используется единственное свойство СК - быть уникальным. Сколько значений ключа, столько и людей и наоборот. Собственно значения безразличны, и ими пользователь явно не оперирует. Поэтому ИМХО СК - логическая концепция, логический адрес в логическом адресном пространстве, полностью подконтрольном приложению, в отличие от физических адресов, которые могут меняться СУБД по своему усмотрению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 00:39 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
Andron Я считаю что искусственный первичный ключ в B вроде бы как и не к чему. Тем более что с практической т.з. выборка записей из B будет производится только на основании записей из А, и некоторого значения поля в B. Основным обоснованием суррогатного ключа называют отсутствие причин менять его значение. Вроде как идентификатор сильнее, если он не меняется. И на практике это имеет особое значение, если есть таблицы которые ссылаются на данную. Тем более если связь один ко многим и этих многих много. Тогда каскадное обновление может приводить к взаимным блокировкам, например, в Оракле. Если таких связей нет, то может суррогатный и не так нужен. Но выделение одного из ключей в качестве первичного все равно имеет значение. Так некторые механизмы СУБД, например, мультимастер репликация в Оракле не допусает участие в репликации таблиц не имеющих первичных ключей. Т.е. если Вы и не объявите первичного ключа, то в будушем все равно возможно придется это сделать. Но в начале это проще. Рел теории не накладвыет требований выделения ключей, но предполагает, что записи таблицы образуют множество (отношение - множество кортежей) - не допускают дубикаты. Могоие РСУБД используют мультимножества. Если в таких не выделять ключей, то, возможно, применение терии, если понадобится потребует что-нить там перепроверять. Т.е. чтобы не о чем таком не думать, то лучше выделить первичный ключ. Если нет подходящего, то суррогатный. Если конечно нет явных причин этого не делать. Таблы у которых нет первичных ключей, воспринмаются обычно как служебные, типа плана запроса или тестов каких-то. Типа если удалить такую, то ничего страшного. Тоже довод объявлять первичный ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 01:30 |
|
||
|
Нужен ли PK в данном случае?
|
|||
|---|---|---|---|
|
#18+
softwarer Ничего подобного, физический адрес может постоянно меняться, например, при расщеплении страниц данных, тогда как логический, на множестве атрибутов, пусть даже суррогатных, никогда. А кто сказал, что он обязан меняться? Простите, это Вы у меня спрашиваете ? И кто - он ? Физический адрес ? Абсолютно не имею представления, от меня подобных утверждений не было, если только Вы не считаете слова "может" и "должен" синонимами. softwarer Здесь имеем расхождение в понимании PK. Для Вас это, скорее, физика, для меня - логика. О чем я и сказал изначально. Для меня PK - логика + физика. Вы говорите с позиции чистой логики, обобщая ее на физику.Никаких обобщений, могу только еще раз повторить, что PK - это логическое понятие, а то, что для поддержки данного вида ограничений производители СУБД, как правило, создают физический уникальный индекс, это дань физике. РМД ничего не знает об индексах, а вот об ограничении типа PK знает. softwarer Если существует однозначный и неизменный набор атрибутов, который позволяет отличить один кортеж от другого, то его уже можно смело считать PKНу, считать PK его на самом деле нельзя, но это отдельный вопрос, который предлагаю не обсуждать.Искренне заинтриговали. Хотелось бы увидеть Ваше определение PK, так как мое утверждение, в целом, не противоречит определению некоторых теоретиков РМД. Возможно, мне пора расширить кругозор. Надеюсь, оно не будет касаться того, что в таблице возможен только один PK, который является всего лишь одним из потенциальных ключей, и его, в принципе, не обязательно объявлять, если есть хотя бы один потенциальный, так как это очевидно любому, кто хоть раз заглядывал в соответствующие труды. Хотя, если PK рассматривать в смысле - логика+физика, то можно добавить пожелание минимальности из всех потенциальных ключей, отсутствия NULL-значений и, по возможности, неизменности на протяжении существования кортежа, но тогда продолжать дальнейшее обсуждение на тему действительно не имеет смысла, так как это выходит за рамки моего понимания PK, тем более, что подобное усиление не всегда возможно. softwarerСформулирую утверждение, которое, полагаю, возможно строго доказать: введение суррогатного ключа не меняет функциональные возможности модели данных, не способно ввести ни одной осмысленной операции, невозможной при отсутствии такого ключа. Бессмысленные операции - может добавить, но кому они нужны?Не знаю, зачем из кустов все время выплывают суррогатные ключи, но классический пример - удаление дублей, которая решаема в отдельных СУБД, как упоминалось ранее, только благодаря введению суррогатного(!) системного идентификатора, играющего роль PK. В случае же отсутствия такового, если пытаться удержаться хотя бы в рамках ANSI-SQL, не говоря уж об РМД, операция перестает быть тривиальной. Следует отметить, что подобная задача не возникла бы в случае изначального следования проектировщиком постулатам РМД, и он сразу бы задумался над тем, что у него будет играть роль PK. softwarerТеперь давайте посмотрим на изначальный вопрос. ... Именно на эту фразу я отвечаю.ОК, будем считать, что неправильно понял Вашу фразу, точнее, вне контекста обсуждения. Хотя, IMHO, изначальный вопрос несколько невнятен. Если связь между таблицами A и B вида 1:1, то введение дополнительного суррогатного(искуственного в терминах автора вопроса, если правильно его понял) ключа, действительно не имеет смысла, достаточно внешний ключ заодно объявить и как PK. Индекс, автоматически создаваемый при таком объявлении "движком" СУБД, будет полезен, как минимум, в таких операциях, как слияние таблиц, или обновление конкретной строки в таблице B. В случае же, когда одной записи из таблицы A соотвествует несколько записей из таблицы B, то PK опять же нужен, но объявлять ли его с помощью введения суррогатного ключа или поискать таковой на множестве существующих атрибутов таблицы B - это другой вопрос. Если PK не вводить, то возможность работы с уникальными записями из таблицы B исчезнет. С помощью операторов SQL станет невозможно ни обновить конкретную строку, ни удалить. Только если снести всю группу соответствующих записей из B, а взамен вставить группу-же тех, которые будут удовлетворять условию. Тоже, конечно, метод, но на любителя... softwarer , в независимости от того, указал ли его проектировщик соответствующим видом ограничения или нет. Если такого набора не будет, то нарушается, как Вы выразились, постулат различимости. Если такого набора нет в значащих данных, суррогатный ключ ничуть не улучшит ситуации. Рассмотрите два набора данных: ВасяПетяМашаСветаВася и 1Вася2Петя3Маша4Света5Вася Покажете ли Вы хоть одну операцию, в которой второй набор чем-то лучше первого при сохранении суррогатности ключа (то есть, грубо говоря, пользователь нигде и никогда не оперирует значением id)?Вы ввели этот пример, Вам и показывать :) Ранее упоминалось, попробуйте из первой таблицы удалить только одного Васю с помощью DELETE, но без использования rowid, или как оно там называется в Oracle, и разумеется, без групповых операций типа Код: plaintext 1. softwarer Кстати, те же суррогатные атрибуты в качестве ключей чаще всего дань той самой физике.Они дань тому, что программирование - инженерная дисциплина, а не гуманитарная. Наша цель - решать задачи, а не строить карточные домики.Веское заявление, но, увы, не уловил связи с моей фразой. Вы не согласны с моим утверждением ? Если так, то готов раскрыть его следующим образом: Как правило, суррогатные ключи вводят именно с целью уменьшения физического размера ключей, которые затем мигрируют в подчиненные таблицы. Другой причиной появления суррогатных ключей, на практике более редкой, является проектировщик, который не может по тем или иным причинам выделить PK. Вы не согласны ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2005, 02:48 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33442277&tid=1545511]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
145ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 469ms |

| 0 / 0 |
