powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как грамотно составить структуру таблиц ?
25 сообщений из 25, страница 1 из 1
Как грамотно составить структуру таблиц ?
    #32935537
Hohol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All !
Есть следующая иерархия из трех справочников - ГруппыТМЦ->ПодгруппыТМЦ->ТМЦ. Структура справочников, в кратце, следующая :
ГруппыТМЦ - № группы XX, наим.группы, где XX - 1-99
ПодгруппыТМЦ - № подгруппы XXYY, наим.группы, где XX - № группы, YY - 1-99
ТМЦ - № ТМЦ XXYYZZZZ, наим.ТМЦ, где XXYY - № подгруппы, ZZZZ - 1-9999
т.е. структура справочников такова что по номеру подгруппы можно сказать к какой группе он принадлежит, а по номеру ТМЦ можно сказать его погруппу и группу.
Номера групп, подгрупп и ТМЦ единажды присвоенные не изменяются и не удаляются если они хоть раз были задействованы в документах движения ТМЦ и не повторяются т.е. для своих таблиц они являются уникальными по сути являясь ЕК.
Вопрос - имеет ли в данной ситуации смысл введение полей ID для сурогатных ключей для организации взаимосвязи таблиц или же сделать связь по естественным ключам ?

На данных момент такая структура уже работает, но реализована в DBF и поддерживается средствами клиентского приложения, связи основаны на ЕК.
ps. Cтатьи на тему ЕК vs СК читал, но для себя решение пока принять не смог.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32935647
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была статья "естественный ключи против суррогатных" на сайте ibase.ru
Все это постоянство и неизменность существующих на данный момент ключей весьма условна. Все меняется. И может так оказаться, что эти ключи придется "переколбашивать".
Так что ИМХО: суррогатные ключи! (ну хотя бы на всяк случай)
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32935743
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно много спорить (и так и не прийти к единому мнению), какие ключи выбрать для таблиц-сущностей. Но вот делать отдельный суррогатный ключ для чисто связующих таблиц -- не следует, т.к. ничего не дает. Всё равно придется делать уникальный индекс по всей комбинации полей, индесы по внешним ключам; и еще плодить отдельный бессмысленный ключ -- ради чего?

Если вдруг придется поменять стркутуру связи -- изменение таблицы будет настолько всеобъемлющим, что сохранение отдельного ключа не даст никаких удобств.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32935749
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoholГруппыТМЦ - № группы XX, наим.группы, где XX - 1-99
А вдруг групп окажется 100?

HoholНа данных момент такая структура уже работает, но реализована в DBF и поддерживается средствами клиентского приложения, связи основаны на ЕК.
А можно на твоем серваке организовать форинкеи по подстроке?

Я за суррогатные ключи в 99% случаев.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936011
Hohol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Серега HoholГруппыТМЦ - № группы XX, наим.группы, где XX - 1-99
А вдруг групп окажется 100?
Вряд ли. Это потребует перекройки всей системы складского учета. Во всяком случае уже около 10 лет на это никто и не думает покушаться.

Серега HoholНа данных момент такая структура уже работает, но реализована в DBF и поддерживается средствами клиентского приложения, связи основаны на ЕК.
А можно на твоем серваке организовать форинкеи по подстроке?
Забыл сказать - коды групп, подгрупп, тмц - числовые значения, потому по подстроке не выйдет.

СерегаЯ за суррогатные ключи в 99% случаев.
Если бы ключ состоял из 3-5 полей - я бы и не задумывался наверное, а тут одно ключевое поля и если вводить сурогатный ключ то это по сути дублирование. Отсюда и сомнения.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936038
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoholЗабыл сказать - коды групп, подгрупп, тмц - числовые значения, потому по подстроке не выйдет.
Так 12345678 - это 3 поля или одно? Если одно и числовое, то можно ли по 12 сделать внешний ключ? Я что-то сомневаюсь.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936525
Hohol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СерегаТак 12345678 - это 3 поля или одно? Если одно и числовое, то можно ли по 12 сделать внешний ключ? Я что-то сомневаюсь.
это одно поле. но его алгоритм формирования такой что можно по коду ТМЦ определить код группы и код подгруппы
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936581
Тип-Топ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hohol СерегаТак 12345678 - это 3 поля или одно? Если одно и числовое, то можно ли по 12 сделать внешний ключ? Я что-то сомневаюсь.
это одно поле. но его алгоритм формирования такой что можно по коду ТМЦ определить код группы и код подгруппы
Такой ключ - очень удачное решение.
Иерархию можно представлять двумя способами:
1. Ссылкой на "родителя"
2. Диапазонами (диапазон "ребенка" - является поддиапазоном "родителя").
Ваше решения совмещает достоинства обоих методов: номер "ребенка" указывает на "родителя" и сам может задавать диапазон для своих "детей".
В отличие от "чистого" первого способа можно выбирать "детей" одним запросом без рекурсии и сортировать по принадлежности своему "родителю".
Иногда это очень облегчает жизнь и разработчикам и пользователям.
Кстати, дополнительные таблицы (классы, подклассы, группы, подгруппы и т.д.) в общем случае не нужны и могут храниться в общей иерархии.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936732
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hoholэто одно поле. но его алгоритм формирования такой что можно по коду ТМЦ определить код группы и код подгруппы
Ну тогда не ясно, как сделать, что бы в 12345678 12 (десятки миллионов и миллионы) были внешним ключом на группу. Чисто технически непонятно. Или целостность опять таки в приложении поддерживать? Или как написать запрос на выборку всех товаров с 12 по 44 группы без учета 34,35 и 47-80 подгрупп? Может и можно конечно, но уж больно извратно ИМХО получится.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936947
Hohol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Серега Hoholэто одно поле. но его алгоритм формирования такой что можно по коду ТМЦ определить код группы и код подгруппы
Ну тогда не ясно, как сделать, что бы в 12345678 12 (десятки миллионов и миллионы) были внешним ключом на группу. Чисто технически непонятно. Или целостность опять таки в приложении поддерживать? Или как написать запрос на выборку всех товаров с 12 по 44 группы без учета 34,35 и 47-80 подгрупп? Может и можно конечно, но уж больно извратно ИМХО получится.
Чтобы поддерживать такую иерархию нужно в таблицу подгрупп внести ссылку на таблицу группы, а в таблицу ТМЦ внести ссылку на подгруппы. Но здесь возникает вопрос - делать это через ЕК или через СК.
В случае связей по ЕК таблицы будут иметь такой вид:
ГрТМЦ - НомГр, НаимГр
ПодгрТМЦ - НомГр, НомПодгр, НаимПодгр
ТМЦ - НомПодгр, НомТМЦ, НаимТМЦ

В случае с СК таблицы будут иметь такой вид:
ГрТМЦ - ИДГр, НомГр, НаимГр
ПодгрТМЦ - ИДГр, ИДПодгр, НомПодгр, НаимПодгр
ТМЦ - ИДПодгр, ИДТМЦ, НомТМЦ, НаимТМЦ

т.е. вариант с СК допускает, что, например, НомТМЦ будет логически показывать на одну группу и подгруппу ТМЦ, а ИДПодгр при этом может быть совершенно другой т.е. условие иерархии нарушается.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936956
Hohol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тип-ТопТакой ключ - очень удачное решение.
Можно уточнить "Такой ключ" - это какой ?

Тип-ТопИерархию можно представлять двумя способами:
1. Ссылкой на "родителя"
2. Диапазонами (диапазон "ребенка" - является поддиапазоном "родителя").
А как в данном случае можно задать диапазон, где он должен быть задан ?

Тип-ТопВаше решения совмещает достоинства обоих методов: номер "ребенка" указывает на "родителя" и сам может задавать диапазон для своих "детей".
В отличие от "чистого" первого способа можно выбирать "детей" одним запросом без рекурсии и сортировать по принадлежности своему "родителю".
Иногда это очень облегчает жизнь и разработчикам и пользователям.
Кстати, дополнительные таблицы (классы, подклассы, группы, подгруппы и т.д.) в общем случае не нужны и могут храниться в общей иерархии.
Т.е. вы предлагаете вообще отказаться от справочников групп и подгрупп ? Тогда и самой иерархии не будет. Или предполагается что записи о группах и подгруппах должны быть в той же таблице что и записи о ТМЦ с указанием уровня и наличия подчиненных записей ?
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32936979
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoholВ случае связей по ЕК таблицы будут иметь такой вид:
ГрТМЦ - НомГр, НаимГр
ПодгрТМЦ - НомГр, НомПодгр, НаимПодгр
ТМЦ - НомПодгр, НомТМЦ, НаимТМЦ

Тогда ничего страшного вроде. Я думал ты хочешь нечто вроде:
ГрТМЦ - НомГр, НаимГр
ПодгрТМЦ - НомПодгр, НаимПодгр
ТМЦ - НомТМЦ, НаимТМЦ

И частью числа из НомХ (что и было непонятно - как?) ссылаться на родителя. А тут просто некоторая избыточность и все.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32938677
Тип-Топ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hohol Тип-ТопТакой ключ - очень удачное решение.
Можно уточнить "Такой ключ" - это какой ?
Составной и хранимый в одном поле, по строго фиксированным правилам разбивки на группы, подгруппы, элементы.

Hohol Тип-ТопИерархию можно представлять двумя способами:
1. Ссылкой на "родителя"
2. Диапазонами (диапазон "ребенка" - является поддиапазоном "родителя").
А как в данном случае можно задать диапазон, где он должен быть задан ?
Здесь:
Код: plaintext
1.
2.
ГруппыТМЦ - № группы XX, наим.группы, где XX -  1 - 99 
ПодгруппыТМЦ - № подгруппы XXYY, наим.группы, где XX - № группы, YY -  1 - 99 
ТМЦ - № ТМЦ XXYYZZZZ, наим.ТМЦ, где XXYY - № подгруппы, ZZZZ -  1 - 9999 

Hohol Тип-ТопВаше решения совмещает достоинства обоих методов: номер "ребенка" указывает на "родителя" и сам может задавать диапазон для своих "детей".
В отличие от "чистого" первого способа можно выбирать "детей" одним запросом без рекурсии и сортировать по принадлежности своему "родителю".
Иногда это очень облегчает жизнь и разработчикам и пользователям.
Кстати, дополнительные таблицы (классы, подклассы, группы, подгруппы и т.д.) в общем случае не нужны и могут храниться в общей иерархии.
Т.е. вы предлагаете вообще отказаться от справочников групп и подгрупп ? Тогда и самой иерархии не будет. Или предполагается что записи о группах и подгруппах должны быть в той же таблице что и записи о ТМЦ с указанием уровня и наличия подчиненных записей ?
Иерархия задается в единой таблице (разделение точками сделано для наглядности):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
00.00.000 Основные материалы
00.01.000 Строительные материалы
00.01.001 Цемент марки "Тра-ля-ля"
00.01.010 Кирпич силикатный марки "Ой-ля-ля"
01.00.000 Топливо
01.01.000 Уголь
01.01.001 Кокс по ГОСТ 123.45.67
01.02.000 Жидкое топливо
01.02.001 Мазут
01.02.002 Керосин
01.02.003 Бензин АИ-92
...
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32938928
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тип-ТопИерархия задается в единой таблице (разделение точками сделано для наглядности):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
00.00.000 Основные материалы
00.01.000 Строительные материалы
00.01.001 Цемент марки "Тра-ля-ля"
00.01.010 Кирпич силикатный марки "Ой-ля-ля"
01.00.000 Топливо
01.01.000 Уголь
01.01.001 Кокс по ГОСТ 123.45.67
01.02.000 Жидкое топливо
01.02.001 Мазут
01.02.002 Керосин
01.02.003 Бензин АИ-92
...

Когда я писАл на Клиппере такое было удобно и применялось повсеместно. Ты попробуй SQL-ем с такой "удачной" таблицей поработай. Если даже "разделение точками сделано для наглядности".
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32939309
Тип-Топ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СерегаКогда я писАл на Клиппере такое было удобно и применялось повсеместно. Ты попробуй SQL-ем с такой "удачной" таблицей поработай. Если даже "разделение точками сделано для наглядности".
Во времена "Клиппера" (15-20 лет назад) я работал на Oracle 6 на SQL...
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32940036
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ООО!!! Великий Клиппер, и ты здесь?
У нас щас примерно так организована структура номенклатурного справочника. Все проги на Клиппере. Да может быть для клипперистов это и удобно, но под SQL - это фигота!
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32940040
Hohol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KlickУ нас щас примерно так организована структура номенклатурного справочника.
"примерно так" - это с помощью одной таблицы или с помощью нескольких ?

KlickДа может быть для клипперистов это и удобно, но под SQL - это фигота!
аргументировать можно ?
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32940266
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тип-ТопВо времена "Клиппера" (15-20 лет назад) я работал на Oracle 6 на SQL...
И что? Удобно SQL-ем пользоваться на такой структуре? Какие плюсы достигаются по сравнению с "обычной" структурой?
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32940592
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аргументировать можно ?
точнее даже не под SQL, а вообще даже
проблемы начинаются когда человеки ведущие справочники неправильно дают номенклатурный номер
пример: записывают Винчестер в группу Хоз.инвентарь ))
он проходит по проводкам с этим номеров
а потом оказывается не там он сидит а исправить номер НИЗЗЗЯ!!!
БОЛЬШОЙ БОЛТ !!!
скажете исправить во всех таблицах и все
но ведь документы уже отпечатаный и унесены в архив...
вообще я пришел к тому что кроме автоинкремнтального уникального ID ничего пока лучше не придумано.
а вот этот код типа 00.01.001 можно хранить в отдельном поле, в общем то это некое расширение наименования
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32940606
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо: номенклатурный справочник = дерево (id, parent_id, name)
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32940625
Тип-Топ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Серега Тип-ТопВо времена "Клиппера" (15-20 лет назад) я работал на Oracle 6 на SQL...
И что? Удобно SQL-ем пользоваться на такой структуре? Какие плюсы достигаются по сравнению с "обычной" структурой?
Об этом подробно писал Joe Celko. Можно найти его публикации в Интернет. Например, то в разделе Древовидные и иерархические структуры, хранение объектов были ссылки на его статьи.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32940804
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тип-ТопОб этом подробно писал Joe Celko.
Читал. И что? Хранить информацию закодировано в одном поле лучше (удачнее) чем раскодировано в разных? Почему? Ведь для работы ее придется постоянно раскодировать. Зачем? Какой в этом великий смысл? Я не против кодов вместо безликого ИД в этом случае . Но зачем искусственно соединять эти коды в одно поле?
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32942695
Тип-Топ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Серега Тип-ТопОб этом подробно писал Joe Celko.
Читал. И что? Хранить информацию закодировано в одном поле лучше (удачнее) чем раскодировано в разных? Почему? Ведь для работы ее придется постоянно раскодировать. Зачем? Какой в этом великий смысл? Я не против кодов вместо безликого ИД в этом случае . Но зачем искусственно соединять эти коды в одно поле?
Затем, что становится легче получать "детские" и "родительские узлы", так как нет необходимости в рекурсии, которая в SQL не стандартизирована. Как следствие, такое решение является удобным и с точки зрения переноса структуры БД между СУБД.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32942826
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тип-ТопЗатем, что становится легче получать "детские" и "родительские узлы", так как нет необходимости в рекурсии, которая в SQL не стандартизирована.
Может я не понял чего, но в чем облегчение то? Почему вычленение атрибута легче его простого чтения?

Тип-ТопКак следствие, такое решение является удобным и с точки зрения переноса структуры БД между СУБД.
Во первых непонятно за счет чего, во вторых - перенос на другую СУБД это все равно нетривиальная задача и "упрощение" (возможное, но не явное) на 3% роли, ИМХО, не играет. Да и не частая это задача, слава Аллаху.
...
Рейтинг: 0 / 0
Как грамотно составить структуру таблиц ?
    #32942896
Тип-Топ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Серега Тип-ТопЗатем, что становится легче получать "детские" и "родительские узлы", так как нет необходимости в рекурсии, которая в SQL не стандартизирована.
Может я не понял чего, но в чем облегчение то? Почему вычленение атрибута легче его простого чтения?
Речь идет не о легкости получения/вычленения атрибута, а о работе с БД на основе полученных значений. В случае, если используется схема со ссылкой на "родительский" узел, то для получения всех вложенных в данный узел "детских" узлов необходимо для каждого вложенного узла выполнить отдельный запрос. Если же иерархия задается диапазонами, то выполняется только один запрос.
Серега Тип-ТопКак следствие, такое решение является удобным и с точки зрения переноса структуры БД между СУБД.
Во первых непонятно за счет чего
За счет того, что схема не требует нестандартных решений, специфических для каждой СУБД (где-то есть возможность использовать запросы с рекурсией, где-то надо создавать селективные процедуры и т.д.).
Серегаво вторых - перенос на другую СУБД это все равно нетривиальная задача и "упрощение" (возможное, но не явное) на 3% роли, ИМХО, не играет. Да и не частая это задача, слава Аллаху.
Да, это не частая задача, но весьма трудоемкая. И возможность снизить эту трудоемкость за счет использования стандартных решений преуменьшать все же не стоит.
Но на всякий случай я подчеркну, что возможно применение любого из решений, как на диапазонах, так и на ссылках. Априори сказать, что какое-то из решений является лучшим всегда, - нельзя. Но если само устройство иерархического справочника соответствует конкретному решению, то надо иметь весьма серьезные аргументы, чтобы не следовать очевидному.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как грамотно составить структуру таблиц ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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