Рекомендовать модель данных SQL для узлов семантической сети? - PullRequest
0 голосов
/ 03 мая 2009

Мы создаем веб-сайт на основе RDBMS для федеральной семантической сети (RDF, Protege и т. Д.). По сути, это большая коллекция узлов, каждый из которых имеет большой и неопределенный набор именованных отношений с (и из) другими узлами.

Моя первая мысль - это одна таблица для всех узлов (имя, описание и т. Д.) Плюс одна таблица для каждого именованного отношения. Есть идеи получше?

Ответы [ 5 ]

1 голос
/ 04 мая 2009

Вы можете оптимизировать производительность, создав 2 строки для каждого отношения.

Допустим, у вас есть таблица Items и таблица Relations, а у Person A есть связь с Person B. В таблице Relations есть левый и правый столбец, оба ссылаются на Items. Теперь, если у вас есть только одна строка для этого отношения, и вы хотите все отношения для определенного элемента, у вас будет запрос, похожий на этот:

SELECT * FROM Relations WHERE LeftItemId = @ItemId OR RightItemId = @ItemId

ИЛИ в этом запросе ухудшит вашу производительность! Если вы продублируете строку и поменяете отношение (слева становится право, и наоборот), запрос выглядит так:

SELECT * FROM Relations WHERE LeftItemId = @ItemId 

При правильном указателе этот показатель будет невероятно быстрым.

1 голос
/ 03 мая 2009

При дальнейшем рассмотрении можно использовать всего две таблицы: одну для узлов (идентификатор, имя, описание) и другую для отношений (идентификатор, имя, описание, от, до), где from и two - идентификаторы в таблице узлов (целые числа). Все еще на правильном пути?

0 голосов
/ 04 мая 2009

Если вы используете SQL Server 2008, вы можете рассмотреть новый тип данных HierarchyID для хранения иерархии. Он оптимизирован для хранения.

0 голосов
/ 03 мая 2009

Если бы у вас не было ни одной таблицы для узлов, вам пришлось бы определить множество таблиц отношений. Для каждого нового типа узла потребуется новая таблица отношений с каждым старым типом узла. Это может быстро выйти из-под контроля.

Так что один стол звучит лучше всего. Вы всегда можете использовать отношение 1: 1 для его расширения, если вам нужны дополнительные поля для определенных типов узлов.

0 голосов
/ 03 мая 2009

Нет, это должно быть хорошо. Обратите внимание на первичный ключ и индексы, чтобы производительность была хорошей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...