如何在关系数据库中存储 trie?
Posted
技术标签:
【中文标题】如何在关系数据库中存储 trie?【英文标题】:How do you store a trie in a relational database? 【发布时间】:2010-09-26 04:26:08 【问题描述】:我有一个前缀树。在关系数据库中表示这种结构的推荐模式是什么?我需要子字符串匹配来保持效率。
【问题讨论】:
是的,不是树。见en.wikipedia.org/wiki/Trie 您是否在数据库中存储和检索 Trie 以在您的代码中使用?因为对于数据库查找,有内置工具,如全文索引(基于类似原则) 【参考方案1】:您的任何实体与其他实体有关系吗?如果不是,也就是不是关系的,带有序列化的哈希表就可以了。
【讨论】:
这真的不是一个尝试...我同意将它保留在数据库之外可能是有意义的,但是将它变成一个哈希表?【参考方案2】:Materialized Path 的设计怎么样?
CREATE TABLE trie (
path VARCHAR(<maxdepth>) PRIMARY KEY,
...other attributes of a tree node...
);
要存储像“***”这样的单词:
INSERT INTO trie (path) VALUES
('s'), ('st'), ('sta'), ('stac'), ('stack'),
('stacko'), ('stackov'), ('stackove'), ('stackover'),
('stackover'), ('stackoverf'), ('stackoverflo'),
('***');
树中的具体化路径是字符本身的前缀序列。这也形成了主键。 varchar 列的大小是您要存储的最大 trie 深度。
我想不出比这更简单直接的了,而且它保留了高效的字符串存储和搜索。
【讨论】:
链接重定向到任何感兴趣的内容。这是一个存档版本:web.archive.org/web/20071019044908/http://www.dbazine.com/… @Howie,谢谢,我在 5.5 年前回答了这个问题,所以有些链接过时也就不足为奇了。 你能举个例子,你将如何查询这个表,说“st”,还有更多像“***one”这样的词SELECT path FROM trie WHERE path='st'
。如果这返回一个非空集,则“st”在 Trie 中。我不知道你在说第二点。以上是关于如何在关系数据库中存储 trie?的主要内容,如果未能解决你的问题,请参考以下文章