|
newscategory
#无级分类,树形结构 无级分类,树形结构javaeye上的同学提供了很好的建议http://www.javaeye.com/topic/114087:处理无级分类http://www.web745.com/article/303.html。 最简单的方式是使用parent_id,使用外键方式,在数据库保存树形结构,这样的数据结构实现简单,易于理解,使用递归方式很容易就从数据库中得到我们需要的模型。 不过这种模型太过简单了,在级别不限,每级的类目不限的情况下难以对分类下的条目信息进行搜索查询。 新闻发布中的新闻分类就是使用上面所说的结构,发布的新闻可以随意归入任何一级分类,这里的分类很可能不是叶子,就是说分类的下面还有子分类,这样进行混排后,很难使用sql语句直接进行查询。 我们曾经想到使用线性链接树,在每个节点上增加一个top_id字段,以外键的形式关联到所处的一级分类上,这样可以通过它实现获得某个一级分类下所有新闻的功能,但如果我们希望得到非一级分类下所有新闻,就无可奈何了。 这时,我们考虑使用编码,为分类扩充信息。 编码最简单的编码形式,code varchar(255),一级分类的编码是01,他下边的二级分类编码依次是0101,0102,0103,这样搜索01分类下所有的新闻,只需要使用模糊查询就可以了。from News where newsCategory.code like '01%'。 这种编码结构清晰,也容易实现,但限制每级分类不能超过100个项目。而我最担心的是使用字符串做模糊查询,是否会影响效率。 位运算编码javaeye中给出的链接是基于位运算的,code bigint,最大值是2的64次方,分为8个深度级别的话,每一级可以包括256个项目。 把编码转换成2进制,前8位是第一级,与字符串型编码类似,用16进制来显示的话,01 00 00 00 00 00 00 00是第一级别。01 01 00 00 00 00 00 00是上一个分类的下级分类。下级的最高位都是相同的,因此如果我们希望取得某一分类下的所有新闻,可以使用from News where newsCategory.code>=01 00 00 00 00 00 00 00 and newsCategory.code<02 00 00 00 00 00 00 00。 最新版本中reversion 7中的代码实现了位运算编码,之前的版本里使用了top_id。但现在对位运算编码和字符串编码的选择有很大疑惑,似乎字符串的更简单。是否位运算与其比较,更有效率呢? |
Sign in to add a comment