sql - 根据层次结构对对象进行分类的良好模式是什么

标签 sql mysql database database-design

我有一个视频列表,我想将其按层次结构进行分类

category (id, name, parent)
video (id, name)
video_category (id, video_id, category_id)

我的类别看起来像这样

/A/B/C/[C1, C2]
/D/E/F/[D1, D2]

如果我的视频分类如下

v1 categorized as C1
v2 categorized as C2

If I view underneath "C" it should show me both videos.

这是一个合适的设计吗?

最佳答案

我认为你的设计相当不错,有一些小评论和一个大问题。

小评论:

  • video_category 不需要 ID,它的列已经形成了唯一的复合主键。在这里添加额外的 ID 可以让您存储重复的数据。
  • 尽量避免使用“id”作为列;将视频表中的 id 列称为“video_id”,这样就可以更轻松地记住可以将其加入到其他表中的哪些列(随着您的架构变得越来越大、越来越复杂,这会变得越来越有用)

最大的问题是但是MySQL不支持先验连接,这是一个问题,因为这是遍历此类树的最直观的方式。有多种方法可以解决这个问题,要么实现更复杂的模式,要么以迭代方式而不是递归方式构造树遍历过程。您可能会发现以下链接很有用:

http://forums.mysql.com/read.php?98,38047,38089#msg-38089

关于sql - 根据层次结构对对象进行分类的良好模式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4825934/

相关文章:

java - 如何修复 "java.sql.SQLException: Can' 当 autocommit=true 时调用提交”

mysql - 我的sql查询有什么问题?

mysql - 无法读取输入文件: Pig store to MYSQL using DBStorage

database - 在 MVC3 中使用 "dynamic"布局页面

sql 2005 动态分组数据

python - SQLAlchemy 查询返回 None

mysql - 哪个 MySQL 变量设置局部变量的默认排序规则?

mysql - 合并两个表

sql-server - 如何使用存储过程创建临时表

sql - 如何使用 Distinct 在查询选择中获取计数元素?