2011-07-08 165 views
1

我正在一个项目中,我需要设计一个像目录管理的表。我只是DB的初学者,所以我真的需要你们的专业知识。我目前的数据库设计思路可以如下图所示:mysql数据库设计和查询optimazation

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。与文件夹类似现实世界的约束complys可以包含文件夹,文件不能有孩子,等...

最常用的查询的情况是:

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

  2. 给出一个id,认定其所有祖先的ID(父母,祖父母...)

考虑大规模应用,问题:

  1. 你认为架构设计合理?如果没有,请提出一个建议。
  2. 对于这两种情况,我该如何编写不会影响性能的机器人查询。

感谢您的任何帮助。

+0

如果parent_id是FK到同一个表0不允许并且必须为NULL –

+0

确定您希望编写的查询并在您在where子句中使用的同一列(按相同顺序)上创建索引。 –

+0

请不要考虑......让我们到1 – bingjie2680

回答

0

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

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

对于正确的索引见注释从达维德Piras酒店

+0

所提到的文章是非常有用的,我正在考虑采用这种方法。 '但可以通过触发器简化'?请你详细说明一下这件事。谢谢您的回答。 – bingjie2680

+0

触发器(MySQL 5.0+) - 它是在表上执行一些操作时调用的过程 - 在您的情况下,这将是插入或更新时的触发器,触发器将重新计算所有左侧和右侧索引 - 尝试查找出 – SergeS

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。

这样你就不必递归找出所有的祖先。