为类别、子类别和相关书籍设计数据库

Posted

技术标签:

【中文标题】为类别、子类别和相关书籍设计数据库【英文标题】:Design database for category, subcategory and associated books 【发布时间】:2015-03-22 19:02:40 【问题描述】:

我知道有几个与我提出的问题类似的问题已经得到了一些答案。但他们的方法看起来并不令人信服。

我的问题是如何为一个可以有书籍的类别和一个也可以有书籍的子类别构建数据库?

我已经设计了一个数据库,但我不相信这种方法。因此,如果有经验的人能给我一些建议或改进或完全不同的方法,我将不胜感激。

这就是我的表格的样子(记住这不是实际代码)

TABLE Category
    ID
    user_id -- Foreign key from user
    name

TABLE SubCategory
    ID
    user_id
    category_id
    name

这本书的桌子有相同的设计。

【问题讨论】:

有趣的是,user_id 出现在问题中的唯一地方是在表定义中,并且您声称其他解决方案不是“专业的”。请修正您的问题,以便它真正解释您想要表示的数据。 你似乎没有理解我的问题。不要专注于user_id 这不是问题。问题是我将如何为一个可以有书籍的类别和一个也可以有书籍的子类别构建数据库?换句话说,我将如何为子类别和父类别设计两个表? 分类和书籍有什么关系?类别(或子类别)是与书籍相关联还是书籍与(子)类别相关联?哪个是主要实体,哪个是次要实体? @TommCatt 不用担心。我想出了一个解决方案。感谢您的帮助。 【参考方案1】:

没有理由为“类别”设置多个表,无论是***类别还是子类别。它们都只是“类别”。

因此,有一个名为“categories”的表,其中包含parent_id 字段:

// categories table
id
name
user_id
parent_id

当您想要提取所有***类别时,只需针对 categories 表运行查询,条件是 parent_id 为空。

然后,当您想要提取子类别时,只需针对categories 表运行查询,条件为parent_id = 123(或其他)。

这不仅使所有内容更加整洁,而且还允许扩展,以防您想继续添加 sub-sub-sub-sub 类别...等。


另一种选择是使用Cakephp's TreeBehavior。

我个人只是宁愿使用我上面建议的方式,但可能只是因为我没有花时间真正理解这种行为。

【讨论】:

很公平,你会怎么做这些书?假设我想将一本书添加到父类别,并且我还可以选择添加到不是父类别的图书,我该怎么做? 您将有一个名为books_categories 的连接表,并为书籍和类别之间的每个关联保留一行。 id, book_id, category_id 如何添加行由您决定,但是一旦结构存在,它应该很容易解释。如果不是,请随时专门写另一个问题。 INDEX(parent_id) 是必需的。 我会非常非常非常小心地使用这样的解决方案。 mysql 基本上不支持分层数据结构或递归查询,所以使用这种结构可能会导致问题。 @GordonLinoff - 我已经在许多相当大的项目中使用它,没有任何明显的缺点。不确定您指的是哪种“问题”,但我没有看到它们。【参考方案2】:

如果parent_category 为空,则它是***。如果它是非空的,那么它是一个子类别。

TABLE Category
  ID
  name
  parent_category

【讨论】:

以上是关于为类别、子类别和相关书籍设计数据库的主要内容,如果未能解决你的问题,请参考以下文章

类别和子类别架构设计

灵活类别/子类别系统中条目的最佳数据库结构?

Excel 图表 - 类别和子类别分组

如何建立数据库表、数据库设计

在单个查询中评估特定的分组值?

SELECT 子类别和没有子类别的父类别