2009-01-15 121 views
1

我遇到的問題如下所示:我公司的供應商爲我們提供了一個包含其產品信息(替代方法是使用XML)的Access數據庫(我導入到SQL Server中),並試圖將其按摩爲更適用於電子商務網站的格式。處理變量類別層次結構

我遇到的問題,也許我只是沒有清楚地思考,是他們的分類信息可以在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),但對於沒有第三級的物品,它從第二級開始顯示。正如您從模式中可以看到的一樣,它們將它們放在一張表中,列出產品及其所屬的所有類別,而不是類似於自引用類別表格和加入產品表格。

問題是,有些項目只有2個級別,有些像這個有4個,有幾個都有6個 - 供應商的樣本網站,可在http://www.biggestbook.com做得很好我想要什麼,但我無法訪問他們的代碼,所以我不知道他們究竟是如何拉回類別並遍歷它們。我假設他們有某種全球性的標誌來表明你目前的水平(例如1個辦公用品,2個信封等等),以便他們可以跟蹤你當前的深度,以及然後檢查每個子級別以查看是否有更多子類別顯示,但是當我想到如何有效處理時,我正在畫空白。他們的命名方案也有很多不足之處,但如果需要的話,我可以稍後解決這個問題。

任何人都有如何解決這個問題的建議?我正在計劃C#/ ASP.NET中的商店(可能是MVC,可能不是),因此C#示例將非常有用,但我可以輕鬆地理解大多數語言。

回答

0

如果您不介意使用遞歸函數遍歷自引用類別表,那麼必須重新設計數據庫以使用該路線。人們會認爲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級類別,產品不具有第三級類別將首先出現,因爲空來頂排序時。

在旁註中,他們會跟蹤您訪問會話中產品的類別。將類別向下追溯到產品,直到URL顯示類似於?R = 12345的內容。麪包屑將顯示用於查找該產品的類別。清除Cookie並刷新頁面,麪包屑將變成最大的預訂>產品詳情。這對於從搜索引擎進入頁面的人來說並不是非常有用,因爲他們無法輕鬆選擇類別來查看可用的類似產品。