如何在关系数据库中存储 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?的主要内容,如果未能解决你的问题,请参考以下文章

关系数据库中如何存储xml数据?

如何在关系数据库中存储带有孩子的链接树?

用户之间好友关系以及亲戚关系如何在数据库存储?

如何在SQLAlchemy模型的构造函数中通过关系存储数据?

如何在关系数据库中使用Elasticsearch

Arcgis空间数据与属性数据关系如何如何?两种数据各是如何存储的