|
|
|
Ключи в моей БД - уникальный счетчик или составной?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34999409&tid=1544138]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
170ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 451ms |

| 0 / 0 |
