Работа с переменными иерархиями категорий - PullRequest
1 голос
/ 15 января 2009

У меня проблема в следующем: поставщик моей компании предоставляет нам базу данных Access (которую я импортирую в SQL Server), содержащую информацию об их продуктах (альтернативой является использование XML), и я пытаюсь втиснуть это в более удобный формат для использования на веб-сайте электронной коммерции.

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

Их данные предоставлены мне в следующей структуре таблицы:

CREATE TABLE [dbo].[ECDB2_HIERARCHY](
    [SEQ_ID] [int] NOT NULL,
    [PFX_NUM] [nvarchar](3) NOT NULL,
    [STK_NUM] [nvarchar](12) NOT NULL,
    [ECDB2_LVL_1] [nvarchar](max)  NULL,
    [ECDB2_LVL_1_ID] [int] NULL,
    [ECDB2_LVL_2] [nvarchar](max) NULL,
    [ECDB2_LVL_2_ID] [int] NULL,
    [ECDB2_LVL_3] [nvarchar](max) NULL,
    [ECDB2_LVL_3_ID] [int] NULL,
    [ECDB2_LVL_4] [nvarchar](max) NULL,
    [ECDB2_LVL_4_ID] [int] NULL,
    [ECDB2_LVL_5] [nvarchar](max) NULL,
    [ECDB2_LVL_5_ID] [int] NULL,
    [ECDB2_LVL_6] [nvarchar](max) NULL,
    [ECDB2_LVL_6_ID] [int] NULL

По большей части я могу игнорировать SEQ_ID, так как он не используется; PFX_NUM и STK_NUM объединяются вместе для формирования SKU продукта, но это не проблема. Мне нужно иметь возможность динамически проходить категории с сайта. Например, с учетом следующей строки:

SEQ_ID: 364867 (ignored)

PFX_NUM: AMP

STK_NUM: 73121

ECDB2_LVL_1: Office Supplies

ECDB2_LVL_1_ID 11

ECDB2_LVL_2: Envelopes, Mailers & Shipping Supplies

ECBD2_LVL_2_ID: 26

ECDB2_LVL_3: Envelopes

ECDB2_LVL_3_ID: 195

ECDB2_LVL_4: Business Letter Envelopes

ECDB2_LVL_4_ID: 795

ECDB2_LVL_5: (empty)

ECDB2_LVL_5_ID: 0

ECDB2_LVL_6: (empty)

ECDB2_LVL_6_ID: 0

Пользователь должен иметь возможность перемещаться по уровням, но меня отталкивает пример веб-сайта, снабженного данными (см. Ниже), который отображает все элементы в подкатегории с произвольными интервалами ... похоже, что на третьем уровень (ecdb2_lvl_3), но для предметов, у которых нет 3-го уровня, он отображается начиная со 2-го. Как видно из схемы, у них все это собрано в одной таблице, в которой перечислены продукты И все категории, к которым они принадлежат, вместо чего-то вроде таблицы категорий с самостоятельными ссылками и затем таблицы присоединяемых продуктов.

Проблема в том, что у некоторых предметов есть только 2 уровня, у некоторых, как этот, есть до 4, а у некоторых есть все 6 - примерный веб-сайт продавца, доступный по адресу http://www.biggestbook.com, делает хорошую работу о том, что я хочу, но у меня нет доступа к их коду, поэтому я остаюсь почесывая голову, как именно они отбрасывают категории и обходят их. Я предполагаю, что у них есть какой-то глобальный флаг, указывающий, на каком уровне вы находитесь в данный момент (например, 1 для канцелярских товаров, 2 для конвертов и т. Д.), Чтобы они могли отслеживать текущую глубину и затем проверьте каждый подуровень, чтобы увидеть, есть ли еще подкатегории, чтобы показать, но я рисую пробел, когда я думаю о том, как справиться с этим эффективно. Их схема именования также оставляет желать лучшего, но я могу заняться этим позже, если потребуется.

У кого-нибудь есть совет, как решить эту проблему? Я планирую хранить в C # / ASP.NET (возможно, MVC, возможно, нет), чтобы примеры C # были бы наиболее полезны, но я могу следовать большинству языков достаточно легко, чтобы понять это.

1 Ответ

0 голосов
/ 15 января 2009

Если вы не возражаете против использования рекурсивных функций для обхода таблицы ссылок на себя, определенно перепроектируйте базу данных, чтобы идти по этому пути. Можно подумать, что рекурсивная функция в SQL может быть самоубийством из-за производительности, но при правильной настройке индексов она может выполняться очень быстро.

Что касается набора данных, с которым вы работаете, вы можете увидеть на примере веб-сайта, что они сохраняют текущую категорию в запросе URL:

Канцелярские товары> Конверты, почтовые программы и расходные материалы> Конверты
? N = 4294858589 & ...

Канцелярские товары> Конверты, почтовые и расходные материалы> Конверты> Конверты с буклетами и каталогами
? N = 4294858588 & ...

Где N - текущая категория. Я думаю, что в их базе данных есть таблица соответствия, чтобы увидеть, к какому уровню относится N. В качестве альтернативы они могли бы просто выполнить большое предложение WHERE / ORDER BY, например:

WHERE (ECDB2_LVL_1_ID == @N) OR (ECDB2_LVL_2_ID == @N) OR (ECDB2_LVL_3_ID == @N) ...
ORDER BY ECDB2_LVL_1_ID, ECDB2_LVL_2_ID, ECDB2_LVL_3_ID...

Если N относится к категории 2-го уровня, продукты, не имеющие категории 3-го уровня, появятся первыми, поскольку при сортировке значение NULL занимает первое место.

Кроме того, они отслеживают, какую категорию вы прошли, чтобы попасть на продукт в сеансе. Следуйте за категорией до товара, пока в URL не появится что-то вроде? R = 12345. Панировочные сухари покажут категорию, используемую для поиска этого продукта. Очистите куки и обновите страницу, хлебные крошки превратятся в «Самая большая книга»> «Сведения о продукте». Это не очень полезно для людей, которые заходят на страницу из поисковой системы, поскольку они не могут легко выбрать категорию, чтобы увидеть, какие похожие продукты доступны.

...