私はかなり単純な問題追跡アプリにエンティティ フレームワークを使用しています。次のような追加のプロパティを追加して、「Issue」エンティティを拡張する機能をユーザーに提供したいと思います。
- 数値フィールド
- テキスト フィールド (シンプルまたはリッチ テキスト)
- 異なるリスト (複数\単一選択)
- ブール値のプロパティ
このタスクを達成するために、次の 2 つの方法を考えました。
拡張可能なデータベース アプローチ
これは単なるアイデアであり、Entity Framework を使用して実装する方法がわからないので、あなたの助けをお待ちしています。基本的な概念は次のとおりです。
- タイプと名前、および場合によってはその他のプロパティを説明する各フィールドのレコードを持つ、IssueExtendedFields というテーブルを作成します。
- 各「リスト タイプ フィールド」のオプションのリストを保持する IssueFieldOptions という別のテーブルを作成します。
- 最終的なテーブルは、IssueExtendedFieldValues という名前で、ユーザーが作成したカスタム フィールドごとに特定の命名規則を持つ列と、課題ごとの外部キーを保持します。
エンティティフレームワークを使用し、テーブルから生成されるEFエンティティオブジェクトがあるため(DBが最初)、理論的には新しい列ごとにDALを再マップして再コンパイルする必要があるため、3番目のステップを実装する方法がわかりません事業。
他に提案はありますか?
辞書的アプローチ
このアプローチは、実装方法を知っています
- タイプと名前、および場合によってはその他のプロパティを説明する各フィールドのレコードを持つ、IssueExtendedFields というテーブルを作成します。
- 各「リスト タイプ フィールド」のオプションのリストを保持する IssueFieldOptions という別のテーブルを作成します。
- そして、システムに入力された各「フィールド - 値」ペアのレコードを保持する IssueExtendedFieldValues という名前の最終テーブル
しかし、それには多くの欠点があります (それらを克服する方法がわかっている場合は、投稿してください)。
- ユーザーが追加するすべての新しいプロパティは単なる別のレコードであり、各エンティティに格納されているデータ量に X を掛けます。ここで、X はプロパティの数です。大量の問題がシステムに入り、さらに 10 個のレコードを保持する別のテーブルが作成されます。 for each issue は、大量のメモリを必要とする巨大なクエリを生成します。
- 予想されるメモリの問題に加えて、レポートやビューのような動的な「ピボット」を作成して、ユーザーがカスタム プロパティのレポートを再度生成できるようにする必要があります。膨大な量のデータを処理する場合、「ピボット」クエリにはさらに時間がかかります。 .