我正在使用asp.net网络表单和linq-to-sql构建分类广告网站。
销售商品需要以分层方式进行分类,但是,单个商品可能属于多个子类别。
有关示例,请查看易趣上的this battery。请注意,有两个面包屑:
声音&视觉>多用途电池&电源>可充电电池
以及:
电脑/平板电脑&网络>笔记本电脑&桌面配件>笔记本电池
除了属于多个类别的项之外,类别也可能包含多个父类,例如在浏览类别“声音和视觉>电池”或“电子>电池”时,在两种情况下都应该看到完全相同的电池子类别(例如可充电或不可充电等)。
我不确定如何开始构建数据库表,更不用说从网站上查询它们了,所以任何帮助或指导都会受到很多关注。
我查看了诸如Storing Hierarchical Data in a Database之类的文章,但由于项目和类别的多对多性质,我认为它不适用于我的案例。
感谢。
答案 0 :(得分:3)
最近我遇到了同样的问题,并将类别存储在像这样的高桌中
CATEGORIES
------------------
Id
Text
ParentId
到目前为止,它对我有用,但如果有更好的答案,我会很好奇
对于您的示例,您可能希望将父项拆分为单独的表,因为您希望能够建立多对多关系
你可以这样做
CATEGORIES
----------------
Id
Text
CATEGORY_PARENTS
----------------
ID
ParentId
答案 1 :(得分:3)
通常,最有效的方法是尽可能以最低级别细分数据,尽可能避免数据冗余。简而言之,尽可能地打破表,同时将相关数据保存在一个组(或这里的表)中,并确保不重复表中的任何实际数据(通过在ID上创建连接表)。
我不确定您愿意更改数据库架构或者当前架构是如何构建的,但是一个解决方案可以是您创建一个表来存储所有主要类别(让我们称之为表A),另一个表是第二级别的类别(表B)和另一个类别的最低级别(表C)。
然后您可以创建一个新表(表D)来附加表A和表B.所以现在您的主要类别和子类别已连接。
现在为子类别创建子类别有点挑战。您可以通过向表D添加一个字段来解决此问题,指示当前项目是否为“子子项目”(我知道,我的命名感觉很糟糕:P)。即,如果指示符字段为0,则其为子猫,否则指示符字段值为父子项的id。这是一种自我加入。
对于属于多个类别的项目,再创建一个连接项目表和表格D的表格(表格E)。在这里,您将'itemID'与'subcatID'连接起来。即如果电池itemID为10,可充电电池的subcatID为5,笔记本电池的subcatID为7,那么你在表E中划了两行
itemID subcatID
10 5
10 7
搜索时,搜索所有10个,您将拥有所有类别。
同样,这是一种可能的解决方案。您也可以使用星型模式,但它对数据仓库特别有效。 如果您的类别级别编号是固定的(即您只有3个等级类别等),那么您可以使用级联样式表(即表A是主要的猫,表B是子猫。表C是最后一个子子猫)。这将使您的查询有点长,但简单。 我只是从数据库字段开始,所以用数据库标签移动/标记这个问题可能会给你一个更好的答案。
祝你好运!答案 2 :(得分:0)
感谢@ bhrugesh-patel和@ andrew-walters试图回答我的问题。然而,在进一步的研究中,上面描述的层次似乎被称为有向无环图(DAG),即几乎是一棵树,但有一个主要区别:你可以通过不同的路径到达同一个节点。
图形数据库(如Neo4j)专为存储DAG等结构而设计,但由于我使用关系数据库(SQL Server),我将尝试实现本文中提到的解决方案:A Model to Represent Directed Acyclic Graphs (DAG) on SQL Databases
仅供参考:另一位question on SO也会更详细地讨论此主题。