3

我必须为学校项目使用 b 树实现一个数据库。该数据库用于存储音频文件(歌曲),并且可以进行许多不同的查询,例如查询给定艺术家或特定专辑的所有歌曲。

直观的想法是在每个字段(歌曲、专辑、艺术家...)上使用 b 树,问题是可以要求删除任何字段的任何成员,并且如果您删除了您拥有的艺术家要从其他 b 树中删除他的所有专辑和歌曲,请记住,例如,在对应于歌曲的 b 树中,给定艺术家的所有歌曲不必彼此靠近。

我的问题是:有没有办法这样做(在删除作者后删除歌曲)而不必遍历其他 b 树的所有元素?我不是在寻找代码只是想法,因为我想出的所有想法都是蛮力的。

4

1 回答 1

4

这是我的理解,可能并不完全正确。

通常在数据库实现中,B 树用于索引,因此除非您想强制用户为每一列建立索引,否则默认为每个字段创建 B 树是不必要的。虽然如此多的索引几乎在所有情况下都会导致快速读取(对所有内容都有索引,您不必进行全表扫描),但它也会导致插入/更新/删除非常慢,因为相应的数据有在每棵树中更新。我相信您知道,现代数据库为您提供至少一个索引(主键),因此您将拥有至少一个 B 树,其中包含一个主键键和一个指向相应节点的指针。

B 树索引中的每个节点都应该有一个指向它所代表的完整对象的指针/引用。

未来创建的索引将包括您在索引中指定的属性,例如歌曲名称、艺术家等,但仍将包含指向相应节点的指针/引用。因此,当您修改歌曲标题时,您将需要修改所有索引引用的引用节点。如果您有任何将修改后的引用作为属性的索引,则必须修改该索引本身中的值。

不幸的是,我相信您的信念是正确的,即在删除/更新时您将不得不通过其他 B 树进行暴力破解,这是使用大量索引的缺点之一(更​​新/删除时间变慢)。如果您只是删除引用的节点,您最终可能会得到指向已删除对象的指针,这将(取决于您的语言)给您某种形式的 NullPointerException。为了防止这种情况,必须从所有树中删除它们的引用。

请记住,尽管对索引进行全盘扫描仍然比全表扫描要好得多。

于 2013-02-23T19:42:13.943 回答