我必须用B树实现一个学校项目的数据库。数据库用于存储音频文件(歌曲),可以进行许多不同的查询,例如询问给定艺术家或特定专辑的所有歌曲。
直观的想法是在b树上为每个字段(歌曲、唱片集、艺术家,…)使用,问题是可以要求删除任何字段的任何成员,如果删除某个艺术家,则必须从其他b树中删除其所有唱片集和歌曲,记住,例如,给定艺术家的所有歌曲不必在对应于歌曲的b树中彼此靠近。
我的问题是:有没有一种方法可以这样做(在对作者进行删除之后删除歌曲),而不必迭代其他b树的所有元素?我不是在寻找代码,只是一些想法,因为所有我想到的都是蛮力的想法。
最佳答案
这是我的理解,可能并不完全正确。
通常在数据库实现中,B树用于索引,因此除非要强制用户为每个列编制索引,否则不必为每个字段默认创建B树。尽管这许多索引在几乎所有情况下都会导致快速读取(在所有情况下都有索引,您不必进行完整的表扫描),但它也会导致极慢的插入/更新/删除,因为每个树中都必须更新相应的数据。如我所知,现代数据库中至少有一个索引(主键),因此至少有一个b树,其中有一个主键和一个指向相应节点的指针。
B树索引中的每个节点都应该有一个指向它所表示的完整对象的指针/引用。
以后创建的索引将包含您在索引中指定的属性,例如歌曲名、艺术家等,但是仍将包含指向相应节点的指针/引用。因此,当您修改(比方说)歌曲标题时,您需要修改所有索引引用的被引用节点。如果有任何索引将修改后的引用作为属性,则必须修改该索引本身中的值。
不幸的是,我相信您的看法是正确的,即在删除/更新时,您将不得不通过其他B树来强行执行操作,这也是使用大量索引(更新/删除时间变慢)的缺点之一。如果您只是删除被引用的节点,您很可能会得到指向已删除对象的指针,这将(取决于您的语言)给您某种形式的nullpointerexception。为了防止出现这种情况,必须从所有树中删除这些引用。
请记住,对索引执行完整扫描仍然比执行完整表扫描要好得多。
关于database - 在数据库中使用b树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15044359/