문제

제가 가지고있는 문제는 다음과 같습니다. 회사의 공급 업체는 제품 정보를 포함하는 액세스 데이터베이스 (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

사용자는 레벨을 탐색 할 수 있어야하지만, 데이터가 제공되는 샘플 웹 사이트 (아래 참조)는 하위 범주 아래에 모든 항목이 무작위 간격으로 표시되는 것입니다 ... 3 단계 (ECDB2_LVL_3 ) 그러나 3 층이없는 항목의 경우 두 번째로 시작합니다. 스키마에서 볼 수 있듯이 자체 참조 범주 테이블 및 가입 제품 테이블과 같은 제품 대신 제품과 모든 범주를 나열하는 한 테이블에 모두 함께 제공됩니다.

문제는 일부 항목이 2 개의 레벨 만 있고 일부 항목은 최대 4 개이며 6 개가 모두 있습니다. http://www.biggestbook.com 내가 원하는 것에 대해 잘 작동하지만 코드에 액세스 할 수 없으므로 카테고리를 정확히 뒤로 당기고 가로 지르는 방법에 대해 머리를 긁고 있습니다. 나는 그들이 당신이 현재 어떤 레벨에 있는지 (예 : 사무용품의 경우 1, 봉투 등의 경우 2 등)를 나타 내기 위해 어떤 종류의 글로벌 깃발을 가지고 있다고 가정합니다. 그래서 현재 깊이가 무엇인지 추적 할 수 있습니다. 그런 다음 각 하위 수준을 확인하여 표시 할 하위 범주가 더 있는지 확인하지만 효율적으로 처리하는 방법을 생각할 때 공백을 그립니다. 그들의 이름 지정 체계는 또한 많은 것을 원하지만, 그것은 필요하다면 나중에 다룰 수있는 것입니다.

이 문제를 해결하는 방법에 대한 조언이 있습니까? 나는 C#/asp.net (아마도 MVC, 아마도 그렇지 않을 수 있음)으로 매장을 계획하고 있으므로 C# 예가 가장 유용 할 것이지만 대부분의 언어를 쉽게 따라 잡을 수 있습니다.

도움이 되었습니까?

해결책

재귀 함수를 사용하여 자체 참조 카테고리 테이블을 통과하는 것이 마음에 들지 않으면 데이터베이스를 다시 설계하여 해당 경로로 이동하십시오. SQL의 재귀 기능은 성능 자살 일 수 있다고 생각할 것이지만 적절한 인덱스가 설정되면 매우 빠르게 완료 될 수 있습니다.

작업중인 데이터 세트는 샘플 웹 사이트에서 현재 범주를 URL 쿼리에 저장하고 있음을 알 수 있습니다.

사무용품> 봉투, 우편물 및 배송 용품> 봉투
? n = 4294858589 & ...

사무용품> 봉투, 우편물 및 운송 용품> 봉투> 소책자 및 카탈로그 봉투
? n = 4294858588 & ...

여기서 n은 현재 범주입니다. 나는 그들의 데이터베이스에 레벨 N이 어떤지 볼 수있는 조회 테이블이 있다고 생각합니다. 또는 그들은 다음과 같은 조항에 의해 큰 위치/주문을 수행 할 수 있습니다.

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 레벨 카테고리 인 경우, 정렬 할 때 NULL이 상단에 오면 3 레벨 카테고리가없는 제품이 먼저 나타납니다.

참고로, 그들은 세션에서 제품에 도달하기 위해 트래버스 한 범주를 추적합니다. URL이? r = 12345와 같은 것을 말할 때까지 제품으로 카테고리를 따라 가십시오. 빵 부스러기는 해당 제품을 찾는 데 사용되는 카테고리를 보여줄 것입니다. 쿠키를 지우고 페이지를 새로 고치면 Breadcrumbs는 가장 큰 책> 제품 세부 사항으로 바뀝니다. 검색 엔진에서 페이지에 나오는 사람들에게는 크게 유용하지 않습니다. 그런 다음 유사한 제품을 쉽게 확인할 수 없기 때문에 범주를 쉽게 선택할 수 없기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top