2009-05-03 2 views
0

連邦セマンティックネットワーク(RDF、Protegeなど)用のRDBMSベースのWebサイトを構築しています。これは、基本的には、ノードの大集合であり、それぞれは、他のノードとの(そしてそこからの)名前付きの関係の大きな不確定なセットを持つ。セマンティックネットワークノードのSQLデータモデルを推奨しますか?

私の最初の考えは、すべてのノード(名前、説明など)の単一のテーブルと名前付き関係ごとに1つのテーブルです。そこに良いアイデアはありますか?

答えて

0

いいえ、それは問題ありません。主キーと索引に注意して、パフォーマンスが良好であるようにします。

0

ノードのテーブルが1つもない場合は、多くのリレーションテーブルを定義する必要があります。新しいノードタイプごとに、という新しい関係テーブルが必要です。すべてのノードタイプはです。それはすぐに手を抜くことができます。

したがって、1つのテーブルが最高の音を出します。特定のノードタイプに追加のフィールドが必要な場合は、常に1:1の関係を使用して拡張することができます。

1

さらに2つのテーブルがあります。ノード(ID、名前、説明)とリレーションシップ(ID、名前、説明、from、to)の2つのテーブルがあります。 fromとtwoはノードテーブル(ints)。それでも正しい軌道にいる?

+0

私は最初から2つのテーブルが必要だと思っていましたが、あなたのテキストを「名前付きリレーションシップの1つのテーブル」と誤解しました...;) 多分、リレーションごとに1つのテーブルは、 (追加の属性を持つ非常に特定の関係タイプがほとんどない場合を除いて) – Lucero

+0

申し訳ありません。助けてくれてありがとう!! –

+0

申し訳ありませんが、私はすぐに読んでいました... – Lucero

0

SQL Server 2008を使用している場合は、新しいHierarchyID datatypeに階層を格納することが考えられます。ストレージに最適化されています。

1

リレーションごとに2行を作成することで、パフォーマンスを最適化できます。

テーブルItemsとテーブルRelationsがあり、Person AがPerson Bとの関係を持っているとします。Relationsテーブルには、Itemを参照する左右の列があります。さて、あなただけのこの関係のために1行を持っている、とあなたが特定のアイテムのすべての関係をしたい場合、あなたはこのように見えるのクエリを持っているでしょう:

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

ORこのクエリでは、あなたのパフォーマンスを台無しにします!あなたが行を複製し、関係を切り替えたい場合、クエリは次のようになります(左、右およびその逆になります):この1つは驚くほど速くなります右のインデックスを持つ

SELECT * FROM Relations WHERE LeftItemId = @ItemId 

を。