SQLデータベース上に独自のトリプルストアを実装しようとしています(はい、完成したプロジェクトがそこにあることはわかっています)。シンボリックな「アトム」を実装するための最良の方法を決定しようとしています。
単純な設計では、subject、predicate、objectと呼ばれる3つのvarchar列を持つ単一の「トリプル」テーブルを作成することにより、SQLにトリプルストアを実装できます。スペースを節約するために、サブジェクト/述語/オブジェクトフィールドで使用される一意のテキストを格納する「アトム」テーブルを作成し、それらのフィールドを、テキストを含むアトムにリンクする外部キーに変更しました。
ただし、Atomテーブルを実装する方法はいくつかあります。
テキストをvarcharとして保存します。
- 長所:テキストの一意性をインデックス付けして適用するのは簡単です。
- 短所:任意の大きなテキストを保存できませんでした。
テキストをテキストブロブとして保存し、一意性をクエリして適用するときに使用するテキストのハッシュも保存します。
- 長所:任意の大きなテキストを保存できます。
- 短所:もう少し複雑です。まれですが、ハッシュアルゴリズム(md5、shaなど)によっては、衝突が発生する可能性があります。
パフォーマンス、長期的な信頼性、およびあらゆる種類のデータを保存する機能の観点から、どちらが優れたアプローチですか?ハッシュを使用する場合、衝突についての正当な懸念はありますか?衝突がまれであっても、トリプルストアを破損するのは1回だけです。