Для категории вполне может потребоваться наличие нескольких родителей. Однако независимо от того, под каким родителем вы нашли категорию, ее подкатегории должны оставаться неизменными.
Я видел реальные системы, которые реализовали именно эту логику и работали нормально.
редактировать
Чтобы ответить на ваш вопрос, я не думаю, что предложенная мной модель настолько ограничительна, как вы себе представляете. По сути, данная ветвь дерева может быть найдена в нескольких родительских ветвях, но где бы она ни находилась, у нее одни и те же дочерние элементы. Ничто из этого не мешает вам выбирать некоторых детей из одной ветви, а также делать их детьми из другой.
Так, например, вы можете включить категорию клеев как в канцелярские товары, так и в товары для хобби, а если вы добавите «Сумасшедший клей (Suppository Edition)» для клеев, она будет отображаться в обоих. Если у вас есть элементы, которые могут быть логически сгруппированы, но их необходимо разделить по использованию, вы все равно можете это сделать. Вы можете поместить слизь и пасту в категорию адгезивов для хобби, которая относится к корню хобби, но не к корню офиса. Или вы можете сделать это и одновременно иметь комбинированную категорию, которая используется вашими покупателями. Что вы не можете сделать, так это забыть включить этот новый тип клея во все соответствующие категории, как только вы добавите его, где бы он ни находился, в онтологию вашей бизнес-модели.
Короче говоря, вы очень мало теряете с этим ограничением, но получаете немного структуры, чтобы избежать необходимости управлять каждым элементом по отдельности.
редактировать
Предполагая, что я убедительно обосновал саму модель, все еще существует проблема реализации. Есть много вариантов, но вот один из способов:
Существует таблица CatalogItem, содержащая синтетический первичный ключ, метку, необязательный текст описания / подробности и необязательный SKU (или эквивалентный). Затем у вас есть много-к-многим CatalogItemJoin с дочерними и родительскими идентификаторами, обе стороны ограничены CatalogItemTable.
Элемент, который отображается как родительский, является категорией, поэтому у него не должно быть SKU. Товар, который появляется только как ребенок, является продуктом, поэтому он должен иметь SKU. Для любого предмета хорошо иметь более одного родителя; это просто означает, что это в нескольких категориях. Кроме того, нет проблем с несколькими детьми на одного родителя; это было бы типичным случаем категории с несколькими продуктами в нем. Однако, учитывая идентификатор категории, ее дочерние элементы будут одинаковыми, независимо от того, какая родительская категория привела вас туда. Другое ограничение заключается в том, что вам нужно избегать циклов.