2008-12-10 6 views
11

J'ai un préfixe trie. Quel est le schéma recommandé pour représenter cette structure dans une base de données relationnelle? J'ai besoin de la sous-chaîne correspondante pour rester efficace.Comment stockez-vous un trie dans une base de données relationnelle?

+1

Oui, pas d'arbre. Voir http://en.wikipedia.org/wiki/Trie – dkretz

+0

Est-ce que vous stockez et récupérez le trie dans/de DB à utiliser dans votre code? Parce que pour la recherche DB, il existe des outils intégrés comme l'indexation de texte intégral (basé sur des principes similaires) –

Répondre

6

Qu'en est-il du design Materialized Path?

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

Pour mémoriser un mot comme « stackoverflow »:

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

Le chemin matérialisé dans l'arbre est la séquence de caractères préfixé lui-même. Cela forme également la clé primaire. La taille de la colonne varchar est la profondeur maximum de trie que vous voulez stocker.

Je ne peux pas penser à quelque chose de plus simple et direct que cela, et il préserve le stockage et la recherche de chaîne efficace.

+1

Le lien redirige vers rien d'intéressant. Voici une version archivée: http://web.archive.org/web/20071019044908/http://www.dbazine.com/oracle/or-articles/tropashko4 – Howie

+1

@Howie, merci, j'ai répondu il y a 5.5 ans, donc Ce n'est pas une surprise que certains liens soient viciés. –

+0

Pouvez-vous donner un exemple de comment allez-vous interroger cette table pour dire "st" et il y a plus de mots comme "stackoverflowone" – zengr

0

Est-ce que l'une de vos entités a une relation avec une autre? Sinon, c'est-à-dire non relationnel, une table de hachage avec une sérialisation le ferait.

+0

Ce n'est vraiment pas un trie ... Je suis d'accord qu'il est probablement logique de le garder hors de la base de données, mais en le transformant en hashtable? – dgtized

+0

O (1) les algorithmes ne sont pas bons pour économiser des ressources. ;) – yogman

Questions connexes