2

ASP.NET MVC3 アプリケーションでの状態の管理について、ここここでいくつか質問があります。回答の 1 つは、これに対するオプションは、各ステップの状態をデータベースに単純に保存することであると述べています。

これが最初に私に提案されたときにいくつかの考えがあったので、これが通常どのように達成されるかについて誰かアドバイスがあるかどうか疑問に思っていました.

無効なエンティティ

3 つのステップを持つマルチステップ フォーム (ウィザード) を考えてみましょう。データベースの各ステップを保存して状態を維持することはできますが、ユーザーがプロセスの途中で Web アプリケーションを閉じて、データベースに無効な状態のエンティティが含まれたままになる可能性があります。

これを克服するために、ウィザードが完了したかどうかを示すフィールドをテーブルに追加できます。一貫性のないアイテムは定期的にレビューされ、必要に応じて自動的に削除されます。たとえば、1 日の終わりにデータベースで無効なエンティティが見つかった場合、それらは自動的に削除されます。

これに関する問題は、アプリケーションに関するメタデータを格納するためにテーブルにフィールドを追加する必要があることです。マルチステップ フォームに入力された情報を格納するすべてのテーブルには、これらのフィールドが必要です。これはどういうわけか私には間違っているようです。解決策の 1 つは、各エンティティ テーブルをメタデータで汚染するのではなく、これを管理するための特定のテーブルを作成することです。

中間データベース

アプリケーションと「実際の」データベースの間にデータベースを配置することを考えました。中間データベースには、各「ステップ」の状態情報を格納するテーブルがあり、最後のステップが完了したときにのみ、この情報が「実際の」データベースに転送されます (一時データは中間データベースから削除されます)。

これは、ASP.NET が提供するセッション状態オプションの 1 つにすでに似ているように思えます。個人的には、これは時間の無駄だと思います。

他のアプリケーションでの使用 (EG デスクトップ)

現時点では、私のアプリケーションは純粋に Web ベースですが、同じデータベースとやり取りできるデスクトップ プログラムを用意する計画があります。Web アプリケーションが状態を保存するために使用する大量のメタデータがデータベースにある場合、デスクトップ アプリケーションはエラーを回避するためにこれを認識する必要があります (つまり、デスクトップ アプリケーションは、設定する必要があることを認識する必要があります)。 Web アプリケーションがエンティティを無効であると見なして 1 日の終わりにエンティティを削除しないように、エンティティを「有効」として状態にします)。

概要

アプリケーションの状態を格納するためにデータベースを最適に使用する方法について、情報やヒントを持っている人はいますか?

  • データベースオプションはそれほど一般的ですか?
  • 多くのエンティティを持つ大規模なアプリケーションに適していますか?
  • パフォーマンスへの影響はありますか?

編集

明確にするために、ASP.NET MVC アプリケーション (TempData、キャッシュ、およびセッション) で状態を管理するための他のオプションが存在することを認識していますが、データベースを使用して状態を管理する方法についての情報に特に関心があります。

私の最初の質問はこれについて明確ではない可能性があるため、他のオプションに言及した人に反対票を投じることは控えてください.

4

2 に答える 2

1

データをセッション状態に保存しないのはなぜですか? セッション状態でアイテムを一意に識別して保存できるメカニズムを考え出すだけで済みます。

まず、InProc セッション状態モードを使用できます。システムが成長するにつれて、セッション状態を状態サーバーまたは SQL サーバーに保存することを検討できます。

于 2012-09-05T13:02:06.173 に答える
0

これは答えが難しいものですが、基本的には 2 つのルートが考えられます。

ウィザードの特定のステップのデータが論理的に正しく、課したすべての制約を満たしている場合、それを「メイン」データベースに書き込むことができます。たとえば、注文を管理するための複数ステップのプロセスがあり、ステップ 1 で顧客レコードが存在しない場合に作成する場合、ユーザーがフォームに入力したときに顧客レコードをデータベースに書き込みます。

これは、ユーザーがその場を離れたり、ブラウザーを閉じたりした場合でも、戻ってきたときにデータがそこにあることを意味します。これはおそらくユーザーが期待することです。

特定のステップのデータに一貫性がない、制約を満たさないなどの場合は、セッション状態を使用して、データベースに書き込む準備ができるまでデータを管理します。MVC でのセッション状態は少し面倒なので、慎重に使用する必要があります。単体テストを作成するのが難しくなります。

セッション状態の目的は、ユーザー セッションに関連するデータを格納することですが、(まだ) データベースに入れることを意図していません。

于 2012-09-05T13:40:38.510 に答える