我必须使用b树为学校项目实施数据库。数据库用于存储音频文件(歌曲),并且可以制作许多不同的查询,例如询问给定艺术家或特定专辑的所有歌曲。
直观的想法是在b树上使用每个字段(歌曲,专辑,艺术家......),问题是可以要求删除任何字段的任何成员,如果您删除了一位艺术家,您必须删除其他b树中的所有专辑和歌曲,请记住,例如,给定艺术家的所有歌曲不必在b树中彼此靠近对应歌曲。
我的问题是:有没有办法(删除作者后删除歌曲)而不必迭代其他b树的所有元素?我不是在寻找代码只是想法,因为我提出的所有代码都是蛮力的。
答案 0 :(得分:2)
这是我的理解,可能不完全正确。
通常在数据库实现中,B树用于索引,因此除非您想强制用户索引每个列,否则默认为每个字段创建B树是不必要的。虽然这几个索引几乎可以在每种情况下快速读取(对所有内容都有一个索引,你不必进行全表扫描),但它也会导致极慢的插入/更新/删除,因为相应的数据有在每棵树中更新。我相信您知道,现代数据库至少有一个索引(主键),因此您将至少有一个带有主键密钥的B树,以及指向相应节点的指针。 / p>
B树索引中的每个节点都应该有一个指向它所代表的完整对象的指针/引用。
创建的未来索引将包括您在索引中指定的属性,例如歌曲名称,艺术家等,但是仍将包含指向相应节点的指针/引用。因此,当您修改(例如)歌曲标题时,您将需要修改所有索引引用的引用节点。如果您有任何索引将修改后的引用作为属性,则必须修改该索引本身的值。
不幸的是,我相信你是正确的,你认为在删除/更新时你必须通过其他B树蛮力,并且是使用大量索引(减缓更新/删除时间)的缺点之一。如果您只是删除引用的节点,您可能最终会得到指向已删除对象的指针,这将(根据您的语言)为您提供某种形式的NullPointerException。为了防止这种情况,必须从所有树中删除它们。
请记住,对索引进行全面扫描仍然比进行全表扫描要好得多。