这是一个困扰我一段时间的心理练习。你会使用什么策略来解决这类问题?
让我们考虑以下简单的数据库结构。我们有目录,显然是一棵树。我们还有内容项,它们总是驻留在某些目录中。
create table directory (
directoryId integer generated always as identity primary key,
parentId integer default null,
directoryName varchar(100)
);
create table content (
contentId integer generated always as identity primary key,
directory integer references directory(directoryId),
contentTitle varchar(100),
contentText varchar(32000)
);
现在假设我们的目录树很大,内容量很大。解决方案必须很好地扩展。
主要问题:如何有效地检索从指定目录及其子目录中找到的所有内容项?
我看到它的方式 SQL 不能用于轻松获取子选择的所有 directoryId。我对么?
可以通过简单的递归循环在应用程序端解决这个问题。不过,这实际上可能会变得非常繁重,并且需要棘手的缓存,尤其是要保证合理的首次访问时间。
也可以构建一个物化查询表并为其动态添加多维索引。可能但实施混乱。太复杂了。
我最喜欢的解决方案可能是添加一个新表,例如
create table subdirectories (
directoryId integer,
subdirectoryId integer,
constraint thekey primary key (directoryId,subdirectoryId)
)
并确保在移动/删除/创建目录时始终手动更新它。因此,我总是可以使用 directoryId 进行选择并获取子目录的所有 Id,包括作为更复杂查询的子选择。我也喜欢 rdbms 能够很好地优化查询这一事实。
你们有什么感想?