自己関連テーブルからデータを効率的にロードする方法
-
29-10-2019 - |
質問
フォーラムアプリを構築するための以下の要件を考えてください
親ポスト
- Child Post1
- Child Post1-1
- Child Post1-2
- Child Post1-2-1
- Child Post2
- Child Post
- Child Post3
.
テーブル構造
tblpost. -
- 郵便
- childpostid
- タイトル
- コンテンツを投稿
- username
=================== P>
再帰的なCTEを使用してこの種のデータを再現することができます。私はこれが最良のアプローチであるとわからない。
質問
-
このデータをSQLを使用して再現する最善の方法は何ですか?
-
は、ORMを使用してこのデータをロードするより良い方法がありますか?
-
SQLルートを行った場合、このデータを以下のようなクラスにロードする最善の方法は次のとおりです。
public class Post { public int PostId {get;set;} public string PostTitle {get;set;} public string PostContent {get;set;} public string PostedBy {get;set;} public IEnumerable<Post> ChildPosts {get;set;} }
-
この種のデータの表示方法は、視聴のためのRazor構文を使って表示されますか??
-
解決
あなたのコメントによると、階層関係を実行するために基本的にpost_id
列とchild_post_id
列がある現在のデータベーススキーマを改善するための提案を受け入れることができます。
次に進みましょう:
SQLを使用してこのデータを取得するための最良の方法は何ですか?
次の記事をご覧になることをお勧めします。これは、そのような階層データを非常に効率的な方法で管理するための非常に優れた手法を示しています。 ネストされたセットモデルを使用します。このモデルでは、左右のノードでセットを定義し、単一のSQLクエリでツリー全体を構築できます。
![]()
ORMを使用してこのデータをロードするためのより良い方法はありますか?
NHibernateやEFなどのORMを使用してこれを行う方法はいくつかありますが、次回はこれを残しておきます。主題は非常に広いので、質問を複数のSO質問に分割することを検討してください。プレーンなADO.NETを使用してこれを行う方法を学ぶと、関連する基本的な手法をはるかによく理解できるため、明日、そのようなORMを使用することにした場合、効率的なクエリの順序で何を探すべきかがすでにわかります。
この種のデータを表示するのはどうですか? ビュー??
階層モデルを構築すると、非常に簡単になります。あなたがしなければならないのは、すべての子投稿の表示テンプレートを呼び出す、
Post
タイプのカスタム表示テンプレートを定義することです。したがって、次のモデルを想定しています: ジェネラコディセタグプレ
および次のコントローラー(明らかに値をハードコーディングしましたが、投稿の冒頭でリンクしたチュートリアルを読んだ後、単一のSQLクエリでこのモデルを構築できるようになります): ジェネラコディセタグプレ
すると、
~/Views/Home/Index.cshtml
ビューが表示されます: ジェネラコディセタグプレそしてもちろん、対応する表示テンプレート(
~/Views/Home/DisplayTemplates/Post.cshtml
)は、この場合は再帰的にツリー全体をレンダリングします: ジェネラコディセタグプレそしてもちろん、最終的な結果は期待できるものです:
![]()
更新:
コメントセクションで要求されているように、Postモデルにデータを入力する方法の一例を次に示します。
入れ子集合モデルに従ってデータベーステーブルを設計したと仮定します。 ジェネラコディセタグプレ そしてあなたがそれを投稿で埋めたこと: ジェネラコディセタグプレ
これで、それらをフェッチできます。
しかし、いつものように、実際に行う前にあなたがやりたいことを説明します。つまり、契約を定義します: ジェネラコディセタグプレ
これで、実行に進みます。この場合、プレーンなADO.NETを使用してデータベースにクエリを実行し、Postオブジェクトを作成します。スタックを使用した反復アルゴリズムを使用してツリーを構築しますが、再帰的アルゴリズムを使用することもできます。 ジェネラコディセタグプレ
このリポジトリができたので、これらをまとめることができます: ジェネラコディセタグプレ
そして最後の部分は、リポジトリの目的の実装を注入するようにお気に入りの依存性注入フレームワークを構成することです。これまでのところ、
PostsRepositoryAdoNet
は1つしかないためです。そして、明日ORMに切り替えることにした場合は、IPostsRepository
インターフェースを実装する対応するリポジトリを作成するだけです。