mysql数据库设计和查询优化

时间:2011-07-08 12:15:44

标签: mysql database database-design

我正在开发一个项目,我需要设计一个像目录管理这样的表。我只是DB的初学者,所以我真的需要你们这些人的专业知识。我目前对数据库设计的想法可以如下所示:

 id   name       type        create_time       parent_id
  1   folder1    folder      2011-2-3             
  2   folder2    folder      2011-2-3             1
  3   folder3    folder      2011-2-3             1
  4   folder4    folder      2011-2-3             1
  5   file1      file        2011-2-3             4
  ....

你可以看到parent_id指向它自己的表PK id。约束符合现实世界,如文件夹可以包含文件夹,文件不能有孩子等...

最常用的查询方案是:

  1. 给定一个id,找到它的所有子文件(包括文件夹和文件),对于每个文件,指示它是否有子项。

  2. 给定一个id,找到它的所有祖先id(父母,祖父母......)

  3. 考虑大规模应用,问题:

    1. 您认为架构设计合理吗?如果没有,请建议一个。
    2. 对于这两种情况,我如何编写不会受到影响的机器人查询。
    3. 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以这样考虑:

id    name     -----   type    ----    create_time       parent_id
  1   folder1  ---  folder  --- 2011-2-3               
  2   folder2  ---  folder    ---  2011-2-3       -----      1
  3   folder3   --- folder    ---  2011-2-3      -----       2-1
  4   folder4  ---  folder    ---  2011-2-3       -----      3-2-1
  5   file1    -----  file      -----  2011-2-3    -----         4-3-2-1

将层次结构信息放在parent_id中,该信息表明其所有祖先。

当你想在folder4下添加一个新文件夹时,例如您只需将4附加到folder4的parent_id值,并将其作为新文件夹的parent_id。

通过这种方式,你不必递归地找出所有的祖先。

答案 1 :(得分:0)

使用parent_id的体系结构不适合列出所有父节点和所有子节点 - 您需要一个递归过程来执行此操作。

看看这篇文章http://www.sitepoint.com/hierarchical-data-database-2/,唯一的问题是添加记录 - 但可以通过触发器进行简化

要获得正确的索引,请参阅Davide Piras的评论