【问题标题】:How do you store a trie in a relational database?如何在关系数据库中存储 trie?
【发布时间】:2010-09-26 04:26:08
【问题描述】:

我有一个前缀树。在关系数据库中表示这种结构的推荐模式是什么?我需要子字符串匹配来保持效率。

【问题讨论】:

  • 是的,不是树。见en.wikipedia.org/wiki/Trie
  • 您是否在数据库中存储和检索 Trie 以在您的代码中使用?因为对于数据库查找,有内置工具,如全文索引(基于类似原则)

标签: database-design schema relational trie


【解决方案1】:

您的任何实体与其他实体有关系吗?如果不是,也就是不是关系的,带有序列化的哈希表就可以了。

【讨论】:

  • 这真的不是一个尝试...我同意将它保留在数据库之外可能是有意义的,但是将它变成一个哈希表?
【解决方案2】:

Materialized Path 的设计怎么样?

CREATE TABLE trie (
  path VARCHAR(<maxdepth>) PRIMARY KEY,
  ...other attributes of a tree node...
);

要存储像“stackoverflow”这样的单词:

INSERT INTO trie (path) VALUES
  ('s'), ('st'), ('sta'), ('stac'), ('stack'),
  ('stacko'), ('stackov'), ('stackove'), ('stackover'),
  ('stackover'), ('stackoverf'), ('stackoverflo'),
  ('stackoverflow');

树中的具体化路径是字符本身的前缀序列。这也形成了主键。 varchar 列的大小是您要存储的最大 trie 深度。

我想不出比这更简单直接的了,而且它保留了高效的字符串存储和搜索。

【讨论】:

  • 链接重定向到任何感兴趣的内容。这是一个存档版本:web.archive.org/web/20071019044908/http://www.dbazine.com/…
  • @Howie,谢谢,我在 5.5 年前回答了这个问题,所以有些链接过时也就不足为奇了。
  • 你能举个例子,你将如何查询这个表,说“st”,还有更多像“stackoverflowone”这样的词
  • SELECT path FROM trie WHERE path='st'。如果这返回一个非空集,则“st”在 Trie 中。我不知道你在说第二点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2012-09-06
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多