2011-07-08 163 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。

這樣你就不必遞歸找出所有的祖先。