为Yelp或eBay(许多类别和子类别)等网站设计数据库和关系的最佳方法是什么?

时间:2009-04-08 05:13:12

标签: database-design associations

他们是否有所有类别的表格和所有子类别的另一个表格(以及子子类别的其他类别等等),或者是什么?所有级别如何相互沟通?

我是一个小伙子,开始研究一个可能具有这种复杂程度的项目,而且我正在努力解决这个问题。

我正在使用Rails,但我也很欣赏数据库模式中的答案,以及进一步阅读的指示等。

2 个答案:

答案 0 :(得分:4)

我假设你在这里处理分层数据。

你只需要两张桌子。其中一个表是类别和类别之间的关系。例如:

CategoryID CategoryName ParentCategoryID
----------------------------------------
1          Computers    NULL
2          Programming  1
3          Games        1
4          Python       2

另一个表用于存储与类别关联的数据。例如:

CategoryID ItemID Description
----------------------------------------------
4          1      Book – Programming in Python
3          1      World of Warcraft

第一个表包含一个外键列,用于将子类别链接到其父类别。这被称为“邻接列表模型”。这个模型的优点是易于理解和执行各种操作(例如,检索Python类的路径 - / Computers / Programming / Python),使用此模型可以使用客户端代码轻松完成(如果不这样做)注意性能成本,因为您可能需要对数据库进行多次查询)。但是,如果您尝试在完整的SQL中执行此操作,则可能令人难以置信。例如,检索类别的路径将需要自联接。

构造此表的另一种方法是将类别和子类别视为集合和子集(称为“嵌套集模型”)。没有图表很难解释这个模型,文章Managing Hierarchical Data in MySQL似乎在解释概念方面做得更好(“邻接列表”和“嵌套集”模型)。

答案 1 :(得分:1)

我的建议是为每个表使用单独的表,但是,“子类别可以存在于多个类别中”的问题也会改变结果。

如果有一对一你有分类表A,那么子类别表B有父类别ID(来自A)。

但是如果它们可以存在于多个类别中,那么您可能会有一个规范化的表结构,其中您将类别A,子类别B和第三个Cat_ID和Sub_ID表作为单个记录。

此外,与产品相关,您还有一个规范化的表设置,其中包含Products Table,Categories表,然后Product_Categories包含product_id和category_id。这是可以无限扩展的(上帝保佑)子类别表,product_subcategories,sub sub,sub sub sub,blah blah blah等等。