2013-02-23 54 views
2

我必須爲一個學校項目實現一個使用b樹的數據庫。數據庫用於存儲音頻文件(歌曲),並且可以進行許多不同的查詢,如詢問給定藝術家或特定專輯的所有歌曲。在數據庫中使用b樹

直觀的想法是基於B樹的使用爲每個字段(歌曲,專輯,藝術家,...),這個問題是一個可以被要求刪除任何領域的任何成員,並在情況你刪除了一個藝術家,你必須從其他b樹中刪除他的所有專輯和歌曲,請記住,例如,給定藝術家的所有歌曲不必在b樹中與歌曲相對應。

我的問題是:有沒有辦法做到這一點(刪除後刪除歌曲作者已經作出)而不必遍歷其他b樹的所有元素?我不是在尋找代碼只是想法,因爲我所提出的所有的都是蠻力的。

+0

是的,這就是你應該做的。刪除歌曲意味着從所有樹中刪除。刪除藝術家意味着刪除他的所有歌曲。這裏沒有捷徑。您不必在其他樹中搜索,因爲歌曲記錄應該有指向所有樹節點的指針。 – 2013-02-23 19:25:35

+0

在你的問題中,你可能有字段和表格。如果你規劃你的模式,你最終會得到幾個表。設計程序時需要牢記這一點。 – didierc 2013-02-23 20:49:04

回答

2

這是我的理解,可能不完全正確。

通常在數據庫實現中B樹被用於索引,因此除非您要強制用戶索引每一列,否則不需要爲每個字段創建B樹。儘管這些索引在幾乎所有情況下都會導致快速讀取(對所有內容都有索引,但不必進行全表掃描),但它也會導致插入/更新/刪除速度非常慢,因爲相應的數據有在每棵樹中更新。正如我相信你知道的那樣,現代數據庫中至少有一個索引(主鍵),所以至少有一個B樹帶有主鍵的鍵和指向適當節點的指針。

B樹索引中的每個節點都應該有一個指向它所表示的完整對象的指針/引用。

創建的未來索引將包括您在索引中指定的屬性,例如歌曲名稱,藝術家等,但仍將包含指向相應節點的指針/引用。因此,當您修改歌曲標題時,您會希望修改所有索引參考的參考節點。如果您有任何將修改後的引用作爲屬性的索引,則必須修改該索引本身中的值。

不幸的是,我相信你的觀點是正確的,你相信你在刪除/更新時必須通過其他B樹蠻橫的方式,並且是使用大量索引的一個缺點(減慢更新/刪除時間)。如果你只是刪除被引用的節點,你最終可能會得到已刪除對象的指針,這將取決於你的語言給你一些NullPointerException的形式。爲了防止這種情況,他們必須從所有樹木中刪除引用。

請記住,儘管對索引進行全面掃描仍然比進行全表掃描要好得多。

+0

btrees的掃描最終將取決於數據庫模式和表之間的關係:如果被修改的行保存索引字段,則每個受影響的btree都必須更新。如果某個字段是另一個表中的外鍵(並且該功能受支持),則必須執行一些一致性檢查。 – didierc 2013-02-23 20:55:52

+0

你是對的,我說每棵樹都必須更新,假設B樹只是根據不同的主鍵索引,並且仍然包含索引中的所有屬性(我相信這是提問者是計劃去做,但我可能是錯的) – 2013-02-23 21:16:49

+0

我明白了,你的回答是正確的。我只是想讓他看到他可能不得不考慮這個問題的這個方面。謝謝! – didierc 2013-02-23 21:32:48