2012-09-19 36 views
2

我正在使用asp.net web表单和linq-to-sql构建一个分类广告网站。如何创建类别和子类别的“eBay风格”层次结构?

销售物品需要按层次分类,但是,单个物品可能处于多个子类别中。

举例来看看eBay上的this battery。请注意,有两个面包屑:

声音&视觉>多功能电池&电源>充电电池
和以及:
电脑/平板电脑&网络>笔记本电脑&台式机配件>笔记本电池

除了一个项目属于多个类别,类别也可以有多个父项目,例如当浏览类别“声音&视觉>电池”或“电子产品>电池”时,在两种情况下(例如,可充电或不可充电等),应该看到完全相同的电池子类别。

我不确定如何开始构建数据库表格,更不用说从网站上查询它们,所以任何帮助或指导都会受到很大的关注。

我看了一些文章,如Storing Hierarchical Data in a Database,但不认为它适用于我的情况,因为这些项目和类别的多对多性质。

谢谢。

回答

0

感谢@ bhrugesh-patel和@ andrew-walters试图回答我的问题。然而,在进一步的研究中,似乎上述层次结构被称为定向无环图(DAG),即几乎是一棵树,但有一个主要区别:您可以通过不同的路径到达相同的节点。图形数据库如Neo4j专为存储像DAG这样的结构而设计,但由于我坚持使用关系数据库(SQL Server),我将尝试实施本文中提到的解决方案:A Model to Represent Directed Acyclic Graphs (DAG) on SQL Databases

供参考:另外question on SO也更详细地讨论了这个话题。

3

最近,我遇到了同样的问题,我在一个高大的表中存储类这样

CATEGORIES 
------------------ 
Id 
Text 
ParentId 

到目前为止,它的工作对我来说,但我很好奇,如果更好的答案一起去

对于你的榜样,你可能想给父母拆分为一个单独的表,因为你希望能够有一个多一对多的关系

你可以做这样的

CATEGORIES 
---------------- 
Id 
Text 


CATEGORY_PARENTS 
---------------- 
ID 
ParentId 
3

通常最有效的方法是尽可能在最低级别分解数据并尽可能避免数据冗余。简而言之,尽可能多地拆分表,同时将相关数据保留在一个组(或表中的一个表)中,并确保您不重复表中的任何实际数据(通过在ID上创建连接表)。

我不知道你是多么愿意改变你的数据库模式或者你目前的架构是如何构建的,但一个解决方案可以为您创建一个表,用于存储所有主要类别(可以称之为表A),另一个表对于第二级别的类别(表B)和一个最低级别的类别(表C)。

然后,您可以创建一个新表(表D)来附加表A和表B.所以现在您的主要类别和子类别已连接。

现在创建子类别的子类别是一个挑战。你可以通过在表D中增加一个字段来解决这个问题,表明当前项目是否是'子子项目'(我知道,我的命名意义很糟糕:P)。即如果指示符字段是0,则它是子猫,否则指示符字段值是父子条目的标识符。这是一种自我加入。

对于属于多个类别的项目,再创建一个连接项目表和表D的表(表E),在此将'itemID'与'subcatID'连接起来。即,如果电池的ItemID是10,可再充电电池的subcatID是5和笔记本电脑的电池的subcatID为7,则你让两行表E

itemID  subcatID 
    10    5 
    10    7 

当搜索,搜索所有10,你将有所有类别。

再次,这是一个可能的解决方案。您也可以使用星型模式,但它对数据仓库特别有效。 如果您的类别级别数字是固定的(即您只有3个级别类别),那么您可以使用级联样式表(即表A是主猫,表B是子猫,而表C是最后一个子子表猫。)。这会让你的查询有点长,但是很简单。 我只是在数据库字段中开始,因此使用数据库标记移动/标记此问题可能会为您提供更好的答案。

祝你好运!

+0

星型模式似乎是一个有趣的方法。我已经投了票,一旦我能够看到它是否适用于我的情况,我会接受答案。谢谢。 – Adnan

+0

非常欢迎你:) –