2

我正在使用 asp.net 网络表单和 linq-to-sql 构建一个分类广告网站。

待售物品需要以分层方式进行分类,但是,单个物品可能在多个子类别中。

例如,看看eBay 上的这款电池。注意有两个面包屑:

声音与视觉 > 多用途电池和电源 > 可充电电池
以及:
计算机/平板电脑和网络 > 笔记本电脑和台式机配件 > 笔记本电脑电池

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

我不确定如何开始构建数据库表,更不用说从网站查询它们了,所以任何帮助或指导都会非常有用。

我看过诸如Storing Hierarchical Data in a Database之类的文章,但由于项目和类别的多对多性质,我认为它不适用于我的情况。

谢谢。

4

3 回答 3

3

最近我遇到了同样的问题,并将类别存储在这样的高桌子中

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

到目前为止它对我有用,但如果有更好的答案,我会很好奇

对于您的示例,您可能希望将父母拆分为单独的表,因为您希望能够建立多对多关系

你可以这样做

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


CATEGORY_PARENTS
----------------
ID
ParentId
于 2012-09-19T13:15:47.377 回答
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 是最后一个子目录.)。这将使您的查询有点长,但仍然很简单。我只是从数据库领域开始,所以用数据库标签移动/标记这个问题可能会给你一个更好的答案。

祝你好运!

于 2012-09-19T14:12:48.230 回答
0

感谢@bhrugesh-patel 和@andrew-walters 尝试回答我的问题。然而,在进一步的研究中,上述层次结构似乎被称为有向无环图(DAG),即几乎是一棵树,但有一个主要区别:您可以通过不同的路径到达同一个节点。

Neo4j 等图形数据库是为存储 DAG 等结构而设计的,但由于我坚持使用关系数据库 (SQL Server),我将尝试实现本文中提到的解决方案:表示有向无环图的模型 ( DAG) 在 SQL 数据库上

仅供参考:关于 SO的另一个问题也更详细地讨论了这个话题。

于 2012-09-20T19:03:26.253 回答