Вопрос

У меня проблема в следующем: поставщик моей компании предоставляет нам базу данных 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 (игнорируется)

PFX_NUM: AMP

STK_NUM: 73121

ECDB2_LVL_1: канцелярские товары

ECDB2_LVL_1_ID 11

ECDB2_LVL_2: конверты, почтовые программы и amp; Доставка расходных материалов

ECBD2_LVL_2_ID: 26

ECDB2_LVL_3: конверты

ECDB2_LVL_3_ID: 195

ECDB2_LVL_4: конверты для деловых писем

ECDB2_LVL_4_ID: 795

ECDB2_LVL_5: (пусто)

ECDB2_LVL_5_ID: 0

ECDB2_LVL_6: (пусто)

ECDB2_LVL_6_ID: 0

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

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

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

Это было полезно?

Решение

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

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

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

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

Где 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-го уровня, будут отображаться первыми, поскольку при сортировке пустое место занимает первое место.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top