|
|
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Хочу спросить у Вас совета перед тем, как окончательно утвердить архитектуру базы данных. Собственно, вопрос будет один. Постановка задачи: Проектируется база данных и разрабатывается программа для работы с ней. БД содержит около 60 таблиц, связанных отношениями “один-к-одному” и “один-ко-многим”. Программа реализуется на Дельфи, связь с БД через ADO. В качестве СУБД выбрана Access 2003 с возможностью будущего перехода на SQL Server или др. Иерархия объектов (по направлению “вниз”) в БД достаточно глубокая, например, связанные таблицы (от главной к подчиненной): “владелец” – “эксплуатант” – “эксплуатируемый объект” – “список участков эксплуатируемого объекта” – “список точек участков объекта” – “список оборудования на точке”. В данном примере, таблицы перечислены сверху-вниз, связаны отношением “один-ко-многим”, каждая имеет дополнительные связи и содержит расширенную информацию. В программе обязательно будут использоваться следующие дополнительные возможности (кроме стандартных операций с данными): 1. Выполнение сложных запросов SQL с объединением данных нескольких таблиц с целью извлечь информацию для составления отчетов по таблицам БД. 2. Интерфейс программы будет поддерживать удобный механизм, реализующий для пользователя привычные режимы работы в режимах “мастер-деталь”, например, прежде чем добраться до окон с данными, последовательно выбрать “владельца” – “эксплуатанта” и “эксплуатируемый объект”. На уровне “эксплуатируемого объекта” данные будут уже “разветвляться” по множеству компактных связанных таблиц. 3. Потребуется ОДНОВРЕМЕННО представлять и редактировать несколько связанных по ключам таблиц в одном элементе DBGrid, для этого выполняется запрос SQL на объединение таблиц с использованием JOIN и вывод его результатов в DBGrid. Вопрос: Иерархия таблиц достаточно серьезная. Как поступить с первичными/внешними ключами – использовать сочетание полей или же вводить для сочетания полей уникальный код? Например: в таблице “эксплуатируемый объект” должны присутствовать поля “код владельца” и “код эксплуатанта” из таблиц уровнем выше. Во всех таблицах, подчиненных “эксплуатируемому объекту” будут присутствовать “код владельца”, “код эксплуатанта”, “код эксплуатируемого объекта” плюс еще параметр, обеспечивающий уникальность записей в таблице. Случай несколько утрирован и приведен для примера. Понятно, что “код эксплуатируемого объекта” может быть использован в качестве первичного ключа (или его части) и в качестве внешнего ключа (или его части) во всех подчиненных таблицах. Данный пример может быть перенесен на другие таблицы. Вопрос – все же лучше кое-где использовать составные ключи или при первой же возможности вводить для сочетания столбцов свое уникальное значение (типа счетчика) и использовать в качестве ключа уже его? Существует еще несколько маленьких аргументов в пользу оставить кое-где составные ключи, которые могут вытекать из будущих требований заказчика, но критическими при принятии решения они не являются – просто облегчают работу и немного увеличивают надежность. Спасибо С уважением, Николай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2007, 15:56 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
SuperNickКак поступить с первичными/внешними ключами – использовать сочетание полей или же вводить для сочетания полей уникальный код? Это зависит от того, желаете ли Вы иметь изысканный геморрой немедленно и грубый секс - при передаче кода тому, кому придется продолжать с ним работать. SuperNickВопрос – все же лучше кое-где использовать составные ключи или при первой же возможности вводить для сочетания столбцов свое уникальное значение Совсем простого ответа нет, но если будете всегда вводить суррогат - окажетесь правы в 99% случаев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2007, 16:01 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
SuperNickВопрос – все же лучше кое-где использовать составные ключи или при первой же возможности вводить для сочетания столбцов свое уникальное значение (типа счетчика) и использовать в качестве ключа уже его?С логической точки зрения нет никакой необходимости в замене составных ключей на "простые", состоящие из одного поля. С физической точки зрения, это может позволить иногда сократить объем БД и упростить написание запросов, так как понадобиться указывать меньше условий связи для сливаемых таблиц. Тем не менее, такой подход может вызвать снижение производительности, так как в случае составных ключей вы получаете возможность параллельного слияния иерархически зависимых таблиц. Пример: в случае "простого" ключа такое слияние должно выполняться последовательно, так как данные для "деда" о "внуке" вы сможете получить только через "сына", и наоборот. В случае составного ключа, "внук" уже знает код "деда", что позволяет избежать лишнего слияние с таблицей-посредником("сыном"/"отцом"), либо, если в запросе требуется информация и о "посреднике", дает возможность выполнять независимого слияния с обоими предками параллельно, что может способствовать росту общей производительности. В то же время, неплохо бы провести сравнения производительности типовых запросов в вашей конкретной ситуации, так как выигрыш/проигрыш обоих вариантов может быть практически неощутим и тогда на первое место может выйти более простой для понимания/программирования вариант, но это будет уже вашим индивидуальным выбором. Лично я предпочитаю разумное использование составных ключей бездумному использованию простых. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 10:30 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
вводите "бездумно" :) сурогатный ключ и не напрашивайтесь на проблемы с модификацией. Если конечно нет "разумного" желания по всей иерархии менять коды, если кому-то вздумается заменить код владельца. p.s. согласен с softwarer , в 99% использование сурогатных ключей - правильный выбор. В 1% попадают такие постоянные величины как коды валют, к примеру, которым не нужен суррогат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 13:38 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
Я могу немного помахать красной тряпкой Использовать суррогат заставляет не реляционная модель, а ее конкретная реализация в современных СУБД. На примере составных ключей это наиболее вопиюще. Вспомним, что цель использования реляционной модели была - облегчить операции вставки, удаления, корректировки данных - обеспечить неизбыточность данных При этом если таблица1 хранит имеет составной первичнй ключ (char(100), char(100)) и 10 таблиц имеет внешним ключом ссылку на эту таблицу - то 100% будут содержать соответсвующее поле и в таблице1 и во всех таблицах, которые ссылаются на эту таблицу. Но так ли задумывалось в реляционной алгебре? - Нет, нет и нет. Я думаю имелось в виду хранить ссылку на запись основной таблицы и не хранить поля, содержащие внешний ключ. И так были реализованы иерархические БД на старых ЕС-ках. Поэтому суррогат - дань излишне прямолинейной реализации реляционной модели. Кстати, если кто-то знает примеры СУБД с более рациональной организацией - жду примера, и критики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 15:32 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
apapacyЯ могу немного помахать красной тряпкой Красной тряпкой неграмотности? Да ну, скучно это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 16:27 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
Звучит убедительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 16:51 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
iscrafmвводите "бездумно" :) сурогатный ключ и не напрашивайтесь на проблемы с модификацией. Если конечно нет "разумного" желания по всей иерархии менять коды, если кому-то вздумается заменить код владельца.Или я не понял вашей глубокой мысли, или вы что-то путаете. Суррогатный ключ никак не является альтернативой составному, так как последний совсем необязательно построен на естественных ключах, а вполне даже на суррогатных, и он совершенно не становиться от этого естественным. А насчет каскадности, выигрываете в одном, проигрываете в другом. Именно этим и надо руководствоваться при выборе ключей в конкретной ситуации, а не категоричными советами, подобно вашему. Следуя ему буквально, можно получить вполне даже осязаемое падение производительности в результате излишнего "утяжелению" БД кучей совершенно ненужной избыточной информации в виде суррогатных значений, не несущих никакого иного смысла, кроме дополнительной идентификации сущности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 17:30 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChA Следуя ему буквально, можно получить вполне даже осязаемое падение производительности в результате излишнего "утяжелению" БД кучей совершенно ненужной избыточной информации в виде суррогатных значений, не несущих никакого иного смысла, кроме дополнительной идентификации сущности. Ответьте на простой вопрос. Что является избыточным? Добавить в таблицу суррогат BIGINT и ссылаться на этот BIGINT во всех связанных таблицах - или хранить естественный ключ (char(100), char(100)) и таскать его за собой во все связанные таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 20:32 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
apapacyОтветьте на простой вопрос. Что является избыточным? Добавить в таблицу суррогат BIGINT и ссылаться на этот BIGINT во всех связанных таблицах - или хранить естественный ключ (char(100), char(100)) и таскать его за собой во все связанные таблицы?Ответьте на простой вопрос. Вы только писатель или читать тоже умеете ? Раз у вас вопрос ко мне, то еще раз, и внимательно, прочтите, что я писал по теме выше. И, надеюсь, тогда вы сами сможете ответить на свой вопрос. P.S. На всякий случай напомню тему топика, если ее случайно не заметили: речь идет о составных ключах vs простых, а не о естественных vs суррогатных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2007, 21:38 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
apapacyПри этом если таблица1 хранит имеет составной первичнй ключ (char(100), char(100)) и 10 таблиц имеет внешним ключом ссылку на эту таблицу - то 100% будут содержать соответсвующее поле и в таблице1 и во всех таблицах, которые ссылаются на эту таблицу. Вы, пожалуйста, не думайте, что все так уж запущено. В качестве первичных ключей (включая составные) выступают только числовые коды. Если нужно, значение, соответствующее коду, будет обнаружено в соответствующей таблице. Повторов информации, избыточности нет. Вообще, я почерпнул много полезного из Вашего обсуждения. Еще существует некоторая проблема, скорее по стройности алгоритма (привожу абстрактный пример): Таблица 1 "Владелец объекта": код владельца (PK) наименование владельца Таблица 2 "Эксплуатант объекта": код владельца (PK, FK на таблицу1) код эксплуатанта (PK) наименование эксплуатанта Таблица 3 "Объект": код объекта (PK) код владельца (FK на таблицу2) код эксплуатанта (FK на таблицу2) ................ наименование объекта Таблица 4 "любая из множества таблиц на верхнем уровне характеристик объекта" код объекта (PK, FK на таблицу 3) код характеристики, например, номер детали (PK) ................. значение 1 значение 2 и т.д. Получается следующее: - С таблицей 1 все нормально - Таблица 2 содержит составной PK – программисты заказчика, а также функциональщики не решили объем функций, касающихся работы на данном уровне, но скорее всего он будет минимален – обеспечить пользователю возможность экспорта/импорта/создании копии эксплуатантов из другой или этой же БД. Естественно, копироваться будет эксплуатант со всеми подчиненными данными. Ради того, чтобы быстрее отработать возможность на прототипе – пока PK в таблице составной (им меньше пересечений искать при выполнении массы sql-запросов). Когда определятся – посмотрю, оставить так или сделать PK код эксплуатанта. Хотя, по-моему, здесь оба варианта нормальные – надо выбирать, что ближе задаче и надежнее с т.з. пользователя. - Таблица 3 – последняя из таблиц, которая в себе содержит FK на код владельца и код эксплуатанта. В ней введен PK “код объекта” и во всех таблицах подчиненных уровней FK ссылаются на “код объекта” Таблицы 3 (я, естественно, упрощаю, т.к. уровней подчинения под объектом несколько, могут присутствовать составные FK). Как с Вашей т.з., не слишком бросается в глаза, что Таблица 2 имеет составной PK, а в Таблицу 3 (и подчиненные) “волевым решением” введено ограничение на уникальный код объекта? Просто повторять еще код владельца и код эксплуатанта в каждой подчиненной таблице – перебор, я решил таким образом их отсечь пока на уровне объекта – в случае чего всегда можно восстановить по связям, тем более, что запросов и функций к владельцу и эксплуатанту будет гораздо меньше, чем на уровне объекта и его характеристик. Выскажите свое мнение, пожалуйста. Ситуация упрощена для примера. Давайте по этому примеру забудем первоначальную тему вопроса – ввести составной ключ или назначать простой и избавляться от составного – просто обсудим логику (отличия подхода) проектирования связей - сначала вроде выбран составной PK (Таблица 2), а потом на одном из уровней (Таблица 3) вводится простой уникальный, который уже используется дальше (иногда в составе составного – семейство таблиц 4). Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 12:31 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
SuperNickСпасибо. полная информация об Объекте: Код: plaintext 1. 2. 3. Вам нужен этот гемморой? Сделайте как советуют, дайте каждому экземпляру своих сущностей уникальный ключ. Зачем повторно вопрос поднимать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 13:36 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
SuperNickВы в курсе, что связи между таблицами могут быть как идентифицирующими, так и неидентифицирующими ? Собственно из их названия уже все понятно. Первые используются для идентификации объекта и входят в первичный ключ, вторые - нет. Упрощенно говоря, разница между ними в следующем. Если удаление объекта подразумевает безусловное удаление связанного объекта, т.е., связанный объект полностью зависит от своего "предка", тогда эта связь идентифицирующая. Стандартным примером может быть позиции документа(допустим, счет-фактуры), их существование полностью зависит от существование так называемой "шапки" документа, т.б., самого документа. Неидентифицирующая не определяет существование связанного объекта и, соотвественно, не входит в первичный ключ подчиненного объекта. Она не определяет существование документа. Наиболее типичным примером можно считать вид валюты позиции платежного документа или единицу измерения в позиции товарном документе. Одним из способов отличить один вид связи от другого является следующий. Если в связанном объекте потенциально может меняться какое-либо поле составного ключа, значит, скорее всего, между ним и объектом-"предком" существует неидентифицирующую связь и делать этому полю в первичном ключе связанного объекта нечего. Например, в большинстве случаев тип документа однозначно определяет документ, т.е., платежное поручение не может стать кассовым ордером или счет-фактурой, поэтому он вполне может быть включен в первичный ключ. Впрочем, это был грубый пример. Надо учитывать, что далеко не во всех моделях предметной области тип документа выделяется как сущность. Традиционно, тип документа определен таблицей, где хранится его "шапка". Соотвественно и нет необходимости вводить атрибут "Тип документа". Ваш абстрактный пример тем не менее наводит на мысль, что вы хотите в первичный ключ таблицы "Объект" добавить неидентифицирующие связи. Существование владельца объекта вряд ли определяет существование эксплуатанта объекта и вместе они вряд ли определяют существование объекта, так что, скорее всего, они лишь его атрибуты. И, соответственно, им нечего делать в составном ключе таблицы "Объект" и таким образом они не будут мигрировать в таблицу "любая из множества таблиц на верхнем уровне характеристик объекта". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 13:44 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChAВы в курсе, что связи между таблицами могут быть как идентифицирующими, так и неидентифицирующими ? [] Например, в большинстве случаев тип документа однозначно определяет документ, т.е., платежное поручение не может стать кассовым ордером или счет-фактурой, поэтому он вполне может быть включен в первичный ключ. Впрочем, это был грубый пример. Надо учитывать, что далеко не во всех моделях предметной области тип документа выделяется как сущность. Традиционно, тип документа определен таблицей, где хранится его "шапка". Соотвественно и нет необходимости вводить атрибут "Тип документа". Беда в том, что выбор идентифицирующая/неидентифицирующая не диктуется природой данных. В частности, чему противоречит неидентифицирующая связь документа с его явно присутствующим в отдельнойтаблице типом? Есть другая разница, формирующая 1% полезности составных ПК: cоставные ключи позволяют декларативно поддерживать ограничения целостности, в которых участвуют более двух таблиц. Типа "Тот же самый" или например "Исключающее или". Ускорение запросов - тоже конечно тема, но это больше похоже на хранение промежуточных результатов в плане плюсов/минусов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 14:18 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
apapacyНо так ли задумывалось в реляционной алгебре? - Нет, нет и нетДа, да, да:). Алгебра - она такая. Плевать ей на экономию байтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 14:21 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChAВы в курсе, что связи между таблицами могут быть как идентифицирующими , так и неидентифицирующими ? Первые используются для идентификации объекта и входят в первичный ключ , вторые - нет. Стандартным примером может быть позиции документа(допустим, счет-фактуры), их существование полностью зависит от существование так называемой "шапки" документа, т.б., самого документа. Вы утверждаете, что поле(я) ссылки на заголовок документа в таблице строк состава документа обязательно входит(ят) в первичный ключ таблицы строк состава документа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 14:39 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
SuperNick Таблица 2 "Эксплуатант объекта": код владельца ( PK , FK на таблицу1) код эксплуатанта ( PK ) наименование эксплуатанта Таблица 3 "Объект": код объекта (PK) код владельца ( FK на таблицу2) код эксплуатанта ( FK на таблицу2) Вы действительно собираетесь так сделать, или просто издеваетесь над присутствующими? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 15:17 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов собираетесь так сделать, или просто издеваетесь над присутствующими? моя вина - не в том месте указал, почему такая необходимость возникла: Для создания прототипов некоторых функций программистами заказчика (для чего и понадобился такой грубый примитивный набросок верхнего уровня БД) с целью дать понять самому же себе (заказчику), какие функции ему нужны, а какие нет. В общем, типичная история. Я в это не вмешиваюсь - их требование (временное, зачем - не спрашивал) и их проблемы, как говорится. Ну не могут люди от программирования на VB под Excel отойти, да и на слово поверить не могут, хотят - пусть чего-то попробуют. Им после макросов, наверное, нелегко будет - выбрали, какой прототип таблицы им удобнее - не стал спорить. На каком ЯП будут прототипы свои делать - после этого даже не спрашивал - как сказали, так и сделал, но предупредил о "эффективности" таких проверок и таких прототипов. Парадоксов много. В окончательном варианте будет правильно. Заверили,что пробовать они будут только для себя, а программу все же нормальный коллектив будет делать. Ладно, это уже не по теме, всякие там организационные проблемы и внутриконторное соревнование. Я написал, что составной PK и FK в указанных Вами таблицах ненадолго в целях прототипирования, но некорректно. Не обращайте внимания на составной FK таблицы 3. Все, что касается таблиц последующих уровней, то они раскрыты более подробно, по ним пытался задавать вопросы, учту Ваши советы по поводу различных вариантов реализации системы отношений, после доопределения задачи по некоторым параметрам и ограничениям. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 16:29 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ModelRБеда в том, что выбор идентифицирующая/неидентифицирующая не диктуется природой данных. В частности, чему противоречит неидентифицирующая связь документа с его явно присутствующим в отдельнойтаблице типом?Разумеется, она диктуется в первую очередь моделью, которую мы строим. Мне казалось, что я это подчеркнул. Данные вне системы их интерпретации сами по себе ничего не значат. Если тип документа не является определяющей сущностью для документа, то вполне может быть и неидентифицирующая связь. С другой стороны, такое достаточно безболезненно возможно только если состав и смысл атрибутов документов совпадает. В противном случае, можно получить неоднократно упоминаемый в этом топике геморрой, но уже не мнимый, а совершенно явный, когда атрибуты документа перестанут соответствовать типу документов. Впрочем, мы, IMHO, уже начинаем все сильнее отходить в сторону от основной линии топика. Для топикстартера, как мне кажется, пока это не важно, так как он, если правильно понимаю, пытается разобраться на некоей абстрактной модели. Хотя по хорошему, конечно, надо рассматривать эти вопросы без отрыва от конкретной ситуации. Сергей ВаскецовВы утверждаете, что поле(я) ссылки на заголовок документа в таблице строк состава документа обязательно входит(ят) в первичный ключ таблицы строк состава документа?При традиционном, реляционном, подходе и наиболее распространимой модели учета, должна входить, так как позиция является сущностью целиком и полностью зависимой от документа. Но, по большому счету, никто не мешает исключить идентификатор документа из первичного ключа позиции, а сделать неидентифицирующую связь, воспользовавшись хотя бы, ранее упомянутым "правилом 99%". В результате, первейшим кандидатом на первичный ключ скорее всего станет суррогатный ключ, необходимость которого совсем не очевидна. Насколько мне известно, к такому подходу нередко склоняются, когда поверх реляционной модели сначала пытаются построить универсальную объектную(фреймворковую) модель, которая обычно подразумевает обязательность уникального идентификатора для любого "объекта", и на которую, в свою очередь, "натягивают" уже предметную область. Но это уже офтопик и здесь не вижу смысла углубляться в него дальше. Какие еще, по вашему, есть вменяемые причины, которые могуть побудить исключить идентификатор документа из первичного ключа его позиции("строки состава"), кроме упомянутых здесь ранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 17:24 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChAКакие еще, по вашему, есть вменяемые причины, которые могуть побудить исключить идентификатор документа из первичного ключа его позиции("строки состава"), кроме упомянутых здесь ранее. С моей точки зрения все наоборот. Не вижу вообще причин в данном случае пихать в PK детали ссылку на мастера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 17:35 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовС моей точки зрения все наоборот. Не вижу вообще причин в данном случае пихать в PK детали ссылку на мастера.Убедительно. Не пихайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 17:43 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChAПри традиционном, реляционном, подходе и наиболее распространимой модели учета, должна входить, так как позиция является сущностью целиком и полностью зависимой от документа Не очень понимаю, что значит выделенное. Давайте на примере попроще. Как по-Вашему, в составе документа в БД могут быть идентичные строки (с одной ценой, номенклатурой и т.п.), как их тогда различать? Предложите свой вариант PK для строки состава документа, обсудим, в частности, как ссылаться на такие строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 17:53 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовНе очень понимаю, что значит выделенное. Давайте на примере попроще. Как по-Вашему, в составе документа в БД могут быть идентичные строки (с одной ценой, номенклатурой и т.п.), как их тогда различать? Предложите свой вариант PK для строки состава документа, обсудим, в частности, как ссылаться на такие строки.Уж куда проще-то ? Если честно, то мне уже надоедает говорить о вполне очевидных вещах, тем более многое уже сказано выше, но вы, похоже, это пропустили и просто зацепились за одну из фраз. Последний раз. Это азы РМД. Любая сущность должна иметь первичный ключ, и этот ключ должен позволять однозначно определять ее как в БД, так и в "реальном" мире, иначе вы не просто сможете их отождествить, а соотвественно, грош цена тем данным, которые непонятно какую сущность описывают. Т.е., "естественный" ключ должен быть всегда, другое дело, что по вполне очевидным причинам мы, как правило, делаем его альтернативным, а вместо него делаем суррогатный, который всегда остается внутри системы. Для зависимых сущностей этот ключ будет составным, именно потому, что они зависимые и, вообще говоря, не могут существовать вне сущности "родителя", поэтому к идентификатору сущности "родителя", добавляется идентификатор этой сущности в рамках родителя. Я не знаю, как еще объяснить, что позиция счет-фактуры, например, сама по себе не существует, если нет счет-фактуры, ее содержащей. И эта позиция обязательно чем-то отличается от других ей подобных в этом документе. В простейшем случае, это ее номер. Именно он позволяет вам качать права, если поставщик вам недопоставил товар. Вы тыкаете поставщика носом в эту строку и говорите, вот по этой позиции мне недодали. Не в суррогатный идентификатор, которого вообще не представлен, я надеюсь, в распечатанном документе. В некоторых случаях, это может быть код товара, например, если таковы принятые правила игры в данной фирме. Соотвественно в таком документе не может быть двух позиций содержащих один и тот же товар. Предлагаю не обсуждать целесообразность такого подхода, это всего лишь один из возможных вариантов. Но в любом случае, есть поле, комбинация полей, которые позволяет явно отличить одну строку от другой в данном документе, как внутри БД, так и вне ее, причем сделать взаимооднозначное соотвествие. Естественно, мы исходим из того, что позиция обычно принадлежит только одному документу, а не нескольким одновременно. Определяя для нее простой "сквозной" суррогатный ключ в общем случае вы добавляете совершенно ненужные данные не считая того, что отсутствие идентификатора документа в первичном ключе может привести к тому, что позиция может быть легко приписана другому документу, так как идентификация позиции перестает зависеть от документа. Более-менее разумные причины все-таки добавлять такой суррогатный ключ уже упоминались в этом топике ранее. Кстати, теоретически, номер позиции внутри документа совершенно не обязательно должен быть последовательным, но обязательно уникальным, чтобы вы могли при выводе как на экран, так и на печать однозначно ее идентифицировать хотя бы по порядку, сиречь номеру, следования. Впрочем, это уже абсолютно неважные детали реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 19:24 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChA Не подумайте, что в моем вопросе кроется что-то кроме впороса - действительно хочу узнать мнение специалиста. Если документ "проводится/перепроводится/отменяется" и имеется на него ссылка в регистре/регистрах с привязкой по строкам документа. Как Вы посоветуете поступать? Хранить в регисте ссылку на (№документа, №строки) или вводить суррогат? (Конечно, регистр это денормализация так как все можно извлечь из документа - но их часто используют на практике) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 20:47 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
> Это азы РМД Азы РМД, дружище ChA, никак не связаны с Вашей интерпретацией этих азов. Написанное Вами про составные ключи - чушь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 21:30 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
SuperNick Все, что касается таблиц последующих уровней, то они раскрыты более подробно, по ним пытался задавать вопросы, учту Ваши советы по поводу различных вариантов реализации системы отношений, после доопределения задачи по некоторым параметрам и ограничениям. Спасибо. Все же универсального решения здесь, наверное, не может быть дано - мало информации. И это уже отмечалось. Но как вариант могу предложить следующее. Если ПК таблицы с характеристиками объекта будет выступать внешним ключом для других таблиц, и эти таблицы будут иметь большое количество записей - (например оперативная информация) - стоит рассмореть использование простого суррогатного ключа. Если же таблица характеристик представляет атрибуты объекта и используется только "из объекта" - такой необходимости нет, можно использовать составной ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 22:06 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
guest_20040621Азы РМД, дружище ChA, никак не связаны с Вашей интерпретацией этих азов. Написанное Вами про составные ключи - чушь.Да, да, я в курсе. Право, не стоило беспокоиться. Когда захотите сказать нечто более существенное, с удовольствием почитаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 08:46 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
apapacyЕсли документ "проводится/перепроводится/отменяется" и имеется на него ссылка в регистре/регистрах с привязкой по строкам документа. Как Вы посоветуете поступать? Хранить в регисте ссылку на (№документа, №строки) или вводить суррогат?Об этом уже неоднократно было сказано выше. Хотите проще, добавляете для строки суррогатный ключ и ссылаетесь на нее, не хотите - используете составной ключ, который может принести некоторые дивиденды. Хотя я, скорее, пересмотрел бы модель, неидентифицирующие ссылки на зависимые объекты меня обычно настораживают. Возможно есть более приемлимое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 09:16 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
> сказать нечто более существенное Если Вы в курсе, то должны быть и в курсе тарифов. Уверены, что можете себе это позволить? А чушь писать в любом случае не стоит. Независимо от того, в курсе Вы или нет. Человек с нормальной подготовкой посмеется. А какой-нибудь студент может поверить. И станет одним потенциальным тупым одинцеконфигурастом больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 10:10 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChA Сергей ВаскецовНе очень понимаю, что значит выделенное. Давайте на примере попроще. Как по-Вашему, в составе документа в БД могут быть идентичные строки (с одной ценой, номенклатурой и т.п.), как их тогда различать? Предложите свой вариант PK для строки состава документа, обсудим, в частности, как ссылаться на такие строки. Уж куда проще-то ? Проще были бы DDL-ки табличек заголовка, состава и, например, налогов по строке состава, которые ссылаются на состав (если по Вашей логике налоги "захардкодены" прямо в строке состава - не беда, придумайте сами любую табличку, которая бы ссылалась на строку состава и на любой другой совершенно "левый" справочник). А мы бы рассмотрели. А то все такие теоретики, аж жуть. ChAЕсли честно, то мне уже надоедает говорить о вполне очевидных вещах Достаточно было ответить на мой вопрос. ChAЛюбая сущность должна иметь первичный ключ, и этот ключ должен позволять однозначно определять ее как в БД, так и в "реальном" мире На кой, простите, требовать от PK идентификации объекта в реальном мире? И вообще, где это написано? ChAиначе вы не просто сможете их отождествить А Вы уверены, что оно всегда мне надо? Как пример в Вашем случае, контроль уникальности №пп я вполне могу оставить до момента утверждения документа, а не выдумывать жесткие констрейнты и затем яростно обходить их при необходимости банального копирования строки. Или просто в ситуации, когда софт установлен у большого количества заказчиков, имеющих различное представление о том, какая же все-таки комбинация полей является уникальной в составе документа. ChAа соотвественно, грош цена тем данным, которые непонятно какую сущность описывают Кому непонятно? ChAТ.е., "естественный" ключ должен быть всегда Кто Вам сказал такую глупость? Есть множество ситуаций (некоторые я привел выше в этом же сообщении), когда никакой естественный ключ на таблице не может существовать как декларативное ограничение. ChAдругое дело, что по вполне очевидным причинам мы, как правило, делаем его альтернативным Ну, если речь о кодах справочников - вполне может быть. ChAДля зависимых сущностей этот ключ будет составным, именно потому, что они зависимые и, вообще говоря, не могут существовать вне сущности "родителя" Опаньки! То есть, в PK включаются как минимум все обязательные поля в таблице? ChAпоэтому к идентификатору сущности "родителя", добавляется идентификатор этой сущности в рамках родителя Вопрос в целесообразности такого включения, а не в том, что если к PK добавить еще и ссылку на родителя, он останется не менее уникальным, чем был PK. ChAЯ не знаю, как еще объяснить, что позиция счет-фактуры, например, сама по себе не существует, если нет счет-фактуры, ее содержащей Если ее (строки состава без заголовка) нет в реальном мире, то это не значит, что в БД не может быть связи, в которой на заголовок вообще пофигу и нет необходимости учитывать, что он должен быть. Как раз наоборот, раз есть строка состава, то и заголовок есть, так как ссылка на заголовок в составе - обязательное поле. ChAИ эта позиция обязательно чем-то отличается от других ей подобных в этом документе.В простейшем случае, это ее номер Пока документ в БД не утвержден, с ним можно делать почти что угодно, и в первом приближении не очевидно, что дял копирования строк состава необходимо уметь на лету править №пп. ChAИменно он позволяет вам качать права, если поставщик вам недопоставил товар Чего? ChAВы тыкаете поставщика носом в эту строку и говорите, вот по этой позиции мне недодали Подозреваю, в такой иллюзорной ситуации (разборки на основании счета-фактуры, а не счета или накладной) используется вовсе не №пп строки состава документа в БД, а то, что на бумажном носителе. У нас №пп хранится в строках состава и им можно управлять, хотя я вполне допускаю, что №пп может формироваться у кого-то только при печати. ChAВ некоторых случаях, это может быть код товара, например, если таковы принятые правила игры в данной фирме. Соотвественно в таком документе не может быть двух позиций содержащих один и тот же товар. Предлагаю не обсуждать целесообразность такого подхода, это всего лишь один из возможных вариантов Теоретически это возможно, практически - нет. ChAНо в любом случае, есть поле, комбинация полей, которые позволяет явно отличить одну строку от другой в данном документе, как внутри БД, так и вне ее, причем сделать взаимооднозначное соотвествие Во-первых, вообще говоря, неочевидна сама необходимость идентификации строк в БД теми методами, которые Вы предлагаете. Как минимум, потому что, во-вторых, не очевидно, что идентификация "как внутри БД, так и вне ее" должна быть одинаковой; почему бы не иметь различную идентификацию "как внутри БД, так и вне ее"? И уж совсем не понятно, зачем необходимо "взаимооднозначное соотвествие". ChAЕстественно, мы исходим из того, что позиция обычно принадлежит только одному документу, а не нескольким одновременно. Определяя для нее простой "сквозной" суррогатный ключ в общем случае вы добавляете совершенно ненужные данные не считая того, что отсутствие идентификатора документа в первичном ключе может привести к тому, что позиция может быть легко приписана другому документу, так как идентификация позиции перестает зависеть от документа. Данные в БД можно испоганить множеством способов, изменить ссылку на заголовок в составе - далеко не самый нетривиальный из них. Если система не дает такую возможность, подобная проблема становится банальнейшей административной проблемой раздачи полномочий на выполнение действий в обход системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 10:33 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChA Любая сущность должна иметь первичный ключ, и этот ключ должен позволять однозначно определять ее как в БД, так и в "реальном" мире, иначе вы не просто сможете их отождествить, а соотвественно, грош цена тем данным, которые непонятно какую сущность описывают. Везет же людям. А мне почему-то некоторые нехорошие сущности совсем ничего должны :(. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 14:09 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ModelR ChA Любая сущность должна иметь первичный ключ, и этот ключ должен позволять однозначно определять ее как в БД, так и в "реальном" мире, иначе вы не просто сможете их отождествить, а соотвественно, грош цена тем данным, которые непонятно какую сущность описывают. Везет же людям. А мне почему-то некоторые нехорошие сущности совсем ничего должны :(. или грош цена тем сущностям, которые не описаны в БД первичным ключем на самом деле про реальный мир это бред полнейший полемический задор теоретика когда мне нужно идентифицировать объект реального мира я вешаю на него инвентарный номер, а не пытаюсь засунуть его целиком в БД зы кстати есть занятные "исключения" в парадигме - системы идентификации по образу (распознование лиц и проч) правда и в них сохраненный в БД "образ" не является первичным ключем, но что-то в этом есть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 14:19 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
guest_20040621Ну в общем, ничего другого и не ожидалось. Как обычно, никаких внятных аргументов. Соответственно, отсутствует смысл дальнейшего общения. И что Вы здесь-то побираетесь ? Хотите заработать, предложите свои услуги на форуме "Работа". Уверен, Вы будете пользоваться там большим успехом. Сергей ВаскецовПроще были бы DDL-ки табличек заголовка, состава и, например, налогов по строке состава, которые ссылаются на состав (если по Вашей логике налоги "захардкодены" прямо в строке состава - не беда, придумайте сами любую табличку, которая бы ссылалась на строку состава и на любой другой совершенно "левый" справочник). А мы бы рассмотрели. А то все такие теоретики, аж жуть.Лучше пообщались бы с топикстартером, если вам есть что сказать. А я вам ничем не обязан, по большому счету, поэтому какие-либо требования или претензии ко мне неуместны. Сергей ВаскецовНа кой, простите, требовать от PK идентификации объекта в реальном мире? И вообще, где это написано?Пожалуйста, не вырывайте фразы из контекста, читайте внимательнее и желательно вдумываясь в общий смысл. Сергей ВаскецовА Вы уверены, что оно всегда мне надо? Как пример в Вашем случае, контроль уникальности №пп я вполне могу оставить до момента утверждения документа, а не выдумывать жесткие констрейнты и затем яростно обходить их при необходимости банального копирования строки. Или просто в ситуации, когда софт установлен у большого количества заказчиков, имеющих различное представление о том, какая же все-таки комбинация полей является уникальной в составе документа.Можно придумать еще много разных эмоциональных ситуаций и что дальше ? Не надо, не делайте, другими словами это уже предлагалось ранее. Сергей ВаскецовКто Вам сказал такую глупость? Есть множество ситуаций (некоторые я привел выше в этом же сообщении), когда никакой естественный ключ на таблице не может существовать как декларативное ограничение.Внимательно перечитал, увидел только надуманные проблемы реализации. Совершенно не обязательно моментальная фиксация изменений в БД в процессе редактирования объекта. Как правило, она выполняется в тразакции по окончании редактирования. А теперь попробуйте ответить себе сами, как пользователь отличает одну позицию от другой ? По суррогатному ключу ? Сергей Васкецов ChAДля зависимых сущностей этот ключ будет составным, именно потому, что они зависимые и, вообще говоря, не могут существовать вне сущности "родителя"Опаньки! То есть, в PK включаются как минимум все обязательные поля в таблице?Хоть убейте, не понимаю логики, которая привела вас к такому выводу. Сергей Васкецов ChAпоэтому к идентификатору сущности "родителя", добавляется идентификатор этой сущности в рамках родителяВопрос в целесообразности такого включения, а не в том, что если к PK добавить еще и ссылку на родителя, он останется не менее уникальным, чем был PK.Безусловно. Аргументы для включения, как и против, были рассмотрены ранее. Похоже все-таки просто зацепились за фразу и таки не удосужились прочитать топик с начала. Сергей ВаскецовЕсли ее (строки состава без заголовка) нет в реальном мире, то это не значит, что в БД не может быть связи, в которой на заголовок вообще пофигу и нет необходимости учитывать, что он должен быть. Как раз наоборот, раз есть строка состава, то и заголовок есть, так как ссылка на заголовок в составе - обязательное поле.Или я вас не понимаю, или вы сами себе противоречите, но никак не мне. А строка существует в реальном мире, как только пользователь ее ввел. Может ее еще и нет в БД, но на экране она точно присутствует. И пользователь прекрасно отличает одну похожую строчку от другой. Всего и надо-то понять, каким образом он это делает. Сергей Васкецов ChAИ эта позиция обязательно чем-то отличается от других ей подобных в этом документе.В простейшем случае, это ее номерПока документ в БД не утвержден, с ним можно делать почти что угодно, и в первом приближении не очевидно, что дял копирования строк состава необходимо уметь на лету править №пп.Забавно, сами же себе ответили на свой же, поставленный выше, вопрос. И, что характерно, он не сильно отличается от моего. Сергей Васкецов ChAВы тыкаете поставщика носом в эту строку и говорите, вот по этой позиции мне недодалиПодозреваю, в такой иллюзорной ситуации (разборки на основании счета-фактуры, а не счета или накладной) используется вовсе не №пп строки состава документа в БД, а то, что на бумажном носителе. У нас №пп хранится в строках состава и им можно управлять, хотя я вполне допускаю, что №пп может формироваться у кого-то только при печати.И что у нас на бумажном носителе ? Я предполагаю, что строки, выведенные в определенном порядке, который однозначно можно восстановить по БД. Хотя для меня лично выглядит несколько абсурдно появление в одной СФ(или накладной) нескольких абсолютно идентичных строк, различающихся, например, только количеством, или только ценой. Если, например, это один и тот же товар, то разумного объяснения такого разбиения я не нахожу. Интересно также, как будут выдавать товар в подобной ситации. Типа, чешем в затылке, потом говорим, это вот из этой кучи, а это из вон той ? Сергей Васкецов ChAНо в любом случае, есть поле, комбинация полей, которые позволяет явно отличить одну строку от другой в данном документе, как внутри БД, так и вне ее, причем сделать взаимооднозначное соотвествиеВо-первых, вообще говоря, неочевидна сама необходимость идентификации строк в БД теми методами, которые Вы предлагаете. Как минимум, потому что, во-вторых, не очевидно, что идентификация "как внутри БД, так и вне ее" должна быть одинаковой; почему бы не иметь различную идентификацию "как внутри БД, так и вне ее"? И уж совсем не понятно, зачем необходимо "взаимооднозначное соотвествие".Вполне возможно, об этом также упоминалось, но вот как вы собираетесь обойтись без соответствия я не понимаю. Данные в БД отражают некую модель реальной жизни, а не находятся в БД сами по себе. Они могут не соотвествовать реальной картине, но тогда, простите, какой в них смысл, кроме задач тестирования производительности СУБД, например ? Сергей ВаскецовДанные в БД можно испоганить множеством способов, изменить ссылку на заголовок в составе - далеко не самый нетривиальный из них.Совершенно верно. Поэтому, если есть возможность избежать их хоть в малейшей мере( смотрите замечания ModelR по поводу составных ключей), то почему бы этого не сделать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 14:33 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChAА я вам ничем не обязан, по большому счету, поэтому какие-либо требования или претензии ко мне неуместны Да какие могут быть к Вам претензии, если Вы свои больные фантазии DDL-ем не в состоянии подтвердить. Предпочитаю обсуждать "Проектирование БД" с практиками, а не теоретиками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 14:43 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ModelR ChA Любая сущность должна иметь первичный ключ, и этот ключ должен позволять однозначно определять ее как в БД, так и в "реальном" мире, иначе вы не просто сможете их отождествить, а соотвественно, грош цена тем данным, которые непонятно какую сущность описывают. Везет же людям. А мне почему-то некоторые нехорошие сущности совсем ничего должны :(.Ну Вы-то хоть не отрывайтесь от контекста. Вот вам простой пример. Берем 10 болванок и записываем на них, например, разную музыку. А теперь вы хотите сохранить информацию в вашем каталоге(БД). Каким образом Вы сможете потом однозначно идентифицировать какому диску в каталоге соответствует реальный диск ? proposed amendmentкогда мне нужно идентифицировать объект реального мира я вешаю на него инвентарный номер, а не пытаюсь засунуть его целиком в БДВот про это и речь. Самый простой способ решения предыдущей задачи - подписываем диск. Вот вам и первичный ключ в реальном мире. В противном случае, вам придется тупо перебирать все диски на предмет соотвествия содержимого записи в каталоге, что, кстати, тоже может играть роль первичного ключа, пусть и не очень эффектвного. P.S. У меня такое впечатление, что все только и заняты вылавливанием конкретных фраз, вместо того, чтобы понять, о чем речь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 14:50 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChAНу Вы-то хоть не отрывайтесь от контекста. Вот вам простой пример. Берем 10 болванок и записываем на них, например, разную музыку. А теперь вы хотите сохранить информацию в вашем каталоге(БД). Каким образом Вы сможете потом однозначно идентифицировать какому диску в каталоге соответствует реальный диск ?Дык в простом примере конечно все просто. А вот если диски вдруг обретут волю и способность менять присвоенные им метки самостоятельно? Или менее фантастический вариант - мы не застрахованы от изменения меток кем-то третьим? Наконец вот . Для системы выглядит как таблетки самопроизвольно меняют свое наименование. ChA P.S. У меня такое впечатление, что все только и заняты вылавливанием конкретных фраз, вместо того, чтобы понять, о чем речь."Истина конкретна" /Гегель/. "Что написано пером..."/ Русск. нар. посл./. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 17:50 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ModelRДык в простом примере конечно все просто.Так я и повторял неоднократно о том, что решается все в каждом конкретном случае, учитываются все плюсы и минусы того или иного решения. Ну нет универсальных рецептов, типа, вводи суррогатные ключи и хаос исчезнет. Да никуда он не денется. ModelRА вот если диски вдруг обретут волю и способность менять присвоенные им метки самостоятельно? Или менее фантастический вариант - мы не застрахованы от изменения меток кем-то третьим?Если нет способа их идентифицировать, то какой тогда толк от информации в БД ? Что она описывает ? Вы будете вынуждены снова идентифицировать их тем или иным образом. А если информация в БД не будет коррелировать с доступной на диске, например, диски - RW. Какой смысл от каталога ? Что когда-то были диски с какими-то метками и там содержалось какая-то информация ? А насколько правдоподобна эта информация ? Ведь проверить, опять же, нельзя. Вообще, здесь можно накрутить много фантастических и не очень ситуаций, но в любом случае смысл информации в БД теряется, если ее невозможно отобразить на то, ради чего она создавалось. Собственно, эту несложную мысль в последних постах я и пытался донести. Я полагал, что она очевидна, но создается впечатление, что большинство наоборот занимаются сферическими конями в вакууме, которые к реальности не имеют ни малейшего отношения. ModelRНаконец вот . Для системы выглядит как таблетки самопроизвольно меняют свое наименование.Это обычные ошибки, которые исправляются в рабочем порядке, включая массу действий, в том числе и организационного характера. Уже давно сказано, что автоматизация хаоса не делает хаос упорядоченным. Но даже в этом примере можно увидеть, что возможность взаимоднозначного отображения все-таки осталась. Если бы ее не было, то БД можно было бы смело стирать, потому что от нее уже не было бы никакой пользы, по крайней мере той, ради которой она создавалась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 19:09 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
> никаких внятных аргументов Ну то есть Вам писать чушь можно. А в ответ Вы хотите аргументированные ответы, почему это чушь? Вы хотя бы один нормальный источник можете назвать, где описывается и обосновывается ересь, о которой Вы так много рассказали? > отсутствует смысл дальнейшего общения Не пишите чуши - не будет повода для "дальнейшего общения". Все просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 21:13 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
proposed amendmentзы кстати есть занятные "исключения" в парадигме - системы идентификации по образу (распознование лиц и проч) правда и в них сохраненный в БД "образ" не является первичным ключем, но что-то в этом есть :) Поиск по вторичным ключам имеет гораздо более широкое применение. Возьмите хотя бы поисковые системы WWW. Даже используя для идентификации объектов свои корпоративные инвентарные номера, внутри БД имеет смысл использовать системные сурогатные ключи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2007, 04:31 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChA ModelRДык в простом примере конечно все просто.Так я и повторял неоднократно о том, что решается все в каждом конкретном случае, учитываются все плюсы и минусы того или иного решения. Ну нет универсальных рецептов, типа, вводи суррогатные ключи и хаос исчезнет. Да никуда он не денется.+1 ChA ModelRА вот если диски вдруг обретут волю и способность менять присвоенные им метки самостоятельно? Или менее фантастический вариант - мы не застрахованы от изменения меток кем-то третьим?Если нет способа их идентифицировать, то какой тогда толк от информации в БД ? [] Т.е. или 100% или никак? а если есть возможность обеспечить (разумными усилиями) только 99,7% точности идентификации - этого коня выбрасывем в вакуум? Мне кажется Вы излишне абсолютизируете это дело. Либо путаете идентификацию объекта внешего мира с идентификацией записи в БД. БД, умеющая иденифицировать лишь 99,7% своих записей - действительно забавно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2007, 10:07 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
ChA Это азы РМД. Любая сущность должна иметь первичный ключ, и этот ключ должен позволять однозначно определять ее как в БД, так и в "реальном" мире, иначе вы не просто сможете их отождествить, а соотвественно, грош цена тем данным, которые непонятно какую сущность описывают. Т.е., "естественный" ключ должен быть всегда, другое дело, что по вполне очевидным причинам мы, как правило, делаем его альтернативным, а вместо него делаем суррогатный, который всегда остается внутри системы. Для зависимых сущностей этот ключ будет составным, именно потому, что они зависимые и, вообще говоря, не могут существовать вне сущности "родителя", поэтому к идентификатору сущности "родителя", добавляется идентификатор этой сущности в рамках родителя. Давайте я попробую привести два примера: 1. Представьте себе сайт типа Одноклассники,ру, и таблицу фотографий. Допустим она содержит четыре содержательных поля:ссылку на человека, саму фотографию, дату и свободный комментарий. Похоже, что ни одно из последних трёх полей не может быть частью первичного ключа. Предоставим возможность посетителям оценивать и комментировать фотографии. Естественно, запись таблицы комментариев должна содержать ссылку на фотографию, так? Какой "естественный" первичный ключ Вы можете предложить? 2. Представьте, я покупаю в магазине носки. 5 пар. Вроде одинаковых. В чеке (а его содержание хранится в базе), 2 строчки. Первая, ссылка на товар (носки такие-то), и количество 4. Вторая, ссылка на товар (носки такие-то), количество 1 и ещё два поля: свободный комментарий "носки слегка выгорели" и скидка 15%. Какой "естественный" первичный ключ Вы можете предложить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 09:19 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
drev Какой "естественный" первичный ключ Вы можете предложить? Итак. 1.Номер комментария, а вот естественный или искусственный это первичный ключ - куй знает. 2.Номер покупки - то же самое. Если у разработчика БД возникают сомнения с PK - лучше вешать простой PK на каждую запись таблицы. "Сущностные" ограничения задавать с помощью констраинтов или уникальных индексов. Поддержание реляционной целостности - задавать отдельно. ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 11:43 |
|
||
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#18+
If you create database tables (it's usually not you, I know, but IF...), NEVER-NEVER-NEVER (!!!) use fields, having any real-life meaning, as a primary key! Even if you are sure the values are unique and required in the business! Such keys are named "natural keys". ALL PRIMARY KEYS MUST SIMPLY BE NUMERATORS (1, 2, 3 ETC.) HAVING NO OTHER CONTEXT BESIDES BEING RECORS IDENTIFIERS! Such keys are named "surrogate (synthetic) keys". For example, you create an information system for a company where each worker already have employee number - don't use that number as the employees table's primary key! Instead, create other one, like emp_id. In addition, you can create a field to keep the existing employee numbers, and "hang" on it the NOT NULL and UNIQUE constraints (as well as for other "real-life" fields like Social Insurance Number) - why not? The databases theory calls such fields "candidate keys" - they are like candidates to be elected as primary keys, but don't allow them to win the elections! A lot of data architects don't realize which problems developers encounter with when natural keys are used. The small problem - when a table have a combination of multiple fields (sometimes 5-8!!!) as its primary key, developers are forced to declare (and pass between objects) multiple variables in places where one would enough to identify the record, and write extra-inflated, haircurling, bugs-prone WHERE clauses. There is also more serious problem which can appear when an information system needs to be changed as result of business requirement changes. Imagine, one day the client stops to manage employee numbers (other example - duplicate ID cards numbers found in at least one country as I know). You will change the functionality (relationships between database and GUI application's objects) spending a lot of time to re-build and re-test the system. But if you have used surrogate PKs - you don't need to perform such "black" work, you are OK because the primary key's meaning has not been changed - it is still a primitive numerator, not more! Programmer, simplify your life! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2007, 20:52 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1544138]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 509ms |

| 0 / 0 |
