2009-01-15 122 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并刷新页面,面包屑将变成最大的预订>产品详情。这对于从搜索引擎进入页面的人来说并不是非常有用,因为他们无法轻松选择类别来查看可用的类似产品。