【发布时间】:2013-04-23 17:14:12
【问题描述】:
我有一个大型自引用表 Items。项目有父项目,像这样:
ITEMS
Long id
String name
String type
Long parentId (fk. ref Items)
使用是非循环的(因此它是树的表示,而不是图形)。
现在,我需要尝试找到某个项目。假设我需要找到类型为“TV”、名称为“海绵宝宝”的项目,以及类型为“电影”且名称为“42”的父项。
我的问题是:哪种方式更好(速度最重要)?
首先选择所有类型为“电影”且名称为“42”的项目,然后选择类型为“电视”、名称为“海绵宝宝”且父 ID 与第一个查询列表匹配的项目
-
单个 HQL 数据库交互,如下所示:
SELECT i from ItemModel i WHERE i.type="TV" AND i.name="Spongebob" AND i.parent.type="TV" AND i.parent.name="42"
现在,#1 将需要更多的数据库交互(在本例中为 2 与 1,但有可能达到 3 或 4 级深度),所以我倾向于认为 #2 会更有效。但是,我不确定 mysql 如何优化这些查询,并且我担心 #2 查询实际上可能会更慢,对自引用连接执行。
不胜感激。
【问题讨论】:
-
MySQL 不支持递归函数,因此它通常不太适合这种分层数据的“邻接表”模型。您是否考虑过“嵌套集”或“传递闭包”模型?
标签: mysql hql self-reference