さまざまなエンティティを持つDBテーブルを使用しています。これは、あらゆる種類の異なるエンティティを保存するために、任意の数のフィールドを含めることができないことを意味します。代わりに、最も重要なフィールド(日付、参照ID-他のさまざまなテーブルへの外部キーの種類、最も重要なテキストフィールドなど)と、より完全なオブジェクトデータを格納する追加のテキストフィールドだけを保存したいと思います。
最も明白な解決策は、XML
文字列を使用してそれらを格納することです。2番目に明白な選択はJSON
、通常はより短く、おそらくシリアル化/逆シリアル化もより高速です...そしておそらくより高速です。しかし、それは本当にですか?JsonSerializerは通常何でもシリアル化できるため、私のオブジェクトも厳密にシリアル化可能である必要はありません。匿名のオブジェクトでさえ、ここで使用することもできます。
この問題を解決するための最適な解決策は何でしょうか?
追加情報
私のDBは高度に正規化されており、Entity Frameworkを使用していますが、外部の超高速全文検索機能を使用するために、DBの非正規化を少し犠牲にしています。情報のためだけに、MySqlの上でSphinxSEを使用しています。Sphinxは行IDを返します。これを使用して、インデックスに最適化されたコングロマリットテーブルを高速クエリし、DB全体の複数のテーブルをクエリするよりもはるかに高速に最も重要なデータを取得します。
私のテーブルには次のような列があります。
RowID
(自動増加)EntityID
(実際のエンティティの-ただし、これは別のテーブルを指す必要があるため、直接関連していません)EntityType
(必要に応じて実際のエンティティを取得できるようになります)DateAdded
(このテーブルに追加されたときにタイムスタンプを記録します)Title
Metadata
(特定のエンティティタイプに関連するシリアル化されたデータ)
このテーブルは、SPHINXインデクサーでインデックス付けされます。このインデクサーを使用してデータを検索するときは、一連のEntityIDs
制限日を指定します。RowIDs
インデクサーは、非常に限られたページ数の注文DateAdded
(降順)を返す必要があります。RowIDs
次に、これらをテーブルに結合して、関連する結果を取得します。したがって、これは実際には全文検索ではなく、フィルタリング検索になります。この方法では取得が非常に高速になり、テーブルから結果を取得する方が、適切にインデックスが作成されていても、比較や比較RowIDs
よりもはるかに高速になります。EntityIDs
DateAdded