Дизайн базы данных для детей-рекурсантов - PullRequest
0 голосов
/ 29 октября 2010

Эта проблема с дизайном оказывается немного более "интересной", чем я ожидал ...

Для контекста я буду реализовывать любое решение, которое получу в Access 2007 (выбор невелик - требование клиента. Я мог бы быть в состоянии передать их в другой бэкэнд, но во внешний интерфейс должен быть Access (и, следовательно, VBA & Access SQL)). Два основных действия, которые я ожидаю от этих таблиц, - это пакетный импорт новых структур из плоских файлов и создание отчетов по структурам (с полной рекурсией всей структуры). Практически не удаляет и не обновляет (кроме целых деревьев, помеченных как неактивные при создании новой версии).

Я имею дело с двумя основными таблицами, и мне интересно, действительно ли у меня есть представление о том, как их соотносить: продукты и детали (есть и другие, но по сравнению с ними они довольно просты).

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

«Веселая» часть состоит в том, что многие части также состоят из частей. Еще раз, данная Часть может использоваться более чем в одной родительской Части (даже внутри одного Продукта). Мало того, я считаю, что число уровней рекурсии нужно считать произвольно эффективным.

Я могу фиксировать отношения с разрешением m-to-m из частей обратно в части, связывая каждую некорневую часть с ее непосредственной родительской частью, но у меня есть скрывающееся подозрение, что я могу настроить себя на горе, если Я останавливаюсь там. Я назову эту часть-часть. У меня возникает несколько вопросов:

  1. Я заимствую неприятности, задаваясь вопросом об этом? Другими словами, я должен просто реализовать две таблицы разрешения, как описано выше, и перестать беспокоиться?

  2. Должен ли я также создать ряды деталей для всех предков каждой некорневой детали с дополнительным столбцом в таблице для хранения числа поколений?

  3. Должна ли часть продукта содержать строки для каждой части продукта или только корневые части? Если бы это были все части, был бы полезен индикатор генерации?

  4. Я (только сегодня, из связанных вопросов) взглянул на подход к проектированию Nested Set. Похоже, что это может упростить некоторые требования (особенно в части отчетности), но размышления о создании дерева при импорте сотен (иногда тысяч) деталей в импорт продукта приводят меня в кошмары, прежде чем я даже засну. Мне лучше кусать эту пулю и идти вперед таким путем?

В дополнение к конкретным вопросам, приведенным выше, я был бы признателен за любые другие комментарии по структурному проектированию, а также за подсказки о том, как обрабатывать его, входящий или исходящий (хотя я боюсь, что не могу принимать предложения по изменению языка / среды СУБД).

Ответы [ 3 ]

1 голос
/ 29 октября 2010

Списки материалов и списки разобранных деталей всегда доставляют массу удовольствия.Я бы использовал Parts в качестве основной таблицы с булевым полем, чтобы сказать, что деталь «продаваема».Это устраняет разницу рекурсии первого уровня и избыточность деталей, которые сами являются продуктами.Затем внедрите Продукты как вид деталей, которые можно продать.

Вы находитесь на правильном пути с таблицей перекрестных ссылок PartPart.Внедрите в эту таблицу ограничение, согласно которому родительская часть и дочерняя часть не могут быть одним и тем же идентификатором детали, чтобы избавить себя от некоторых головных болей с бесконечной рекурсией.уровень фактического изменения и на любых более высоких уровнях, на которых должно быть выполнено изменение (если вы хотите сказать, что эта новая Часть, как часть ее родительской иерархии, приводит к новому Продукту).Затем обновите дерево ссылок любых уровней деталей, которые не были пересмотрены при смене поколений (чтобы сохранить детали и продукты, которые не должны изменяться поколением, если это делает ребенок).Чтобы избежать осиротения (записи об элементах без ссылок, которые недоступны с верхнего уровня), части могут ссылаться на своего предшественника напрямую, создавая связанный список предков.

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

0 голосов
/ 29 октября 2010

Образцы схем базы данных спецификаций можно найти по адресу

http://www.databaseanswers.org/data_models/

. Для некоторых моделей на веб-сайте доступны приложения Access.Уточните у автора сайта.

0 голосов
/ 29 октября 2010

У меня будет одна таблица частей для атомарных частей, затем таблица суперчастей с superpartID и связанными с ним частями. Тогда вы можете иметь таблицу продуктов / суперпартий. Если часть также является суперчастью, то у вас есть только одна строка для superpartID с тем же partID.

Может быть, «компонент» - это лучший термин, чем суперчасть. Компоненты могут быть повторно использованы в более крупных компонентах, например.

...