0

まず、SQL Server を使用して Entity Framework Code First 5.0 で ASP.NET MVC を使用しています。毎日、30 分ごとに状態 (Working/Off) を保存する必要があるアプリケーションがあります。id, day, time, status, user_id計算すると、すべてのユーザー (潜在的に数千のユーザー) に対して( ) だけの 336 行になります。

ストレージ サイズとアプリケーションのパフォーマンスの点で、これらのシナリオのうちどれがより最適かを考えていました (あなたの意見では)。

  1. これらをステータスごとに 1 行 ( id, day, time, status, user_id) として保存するため、ユーザーごとに 336 行になります。
  2. データベースのコンマ区切りフィールド (1 つの非常に大きな行) にすべて保存し、C# を使用して解析します。
  3. 私が調べていない、または考慮していないより良い方法はありますか?

私は現在、オプション1に傾いています。

4

3 に答える 3

2

これらは個別のデータであるため、カンマ区切りの値としてまとめないでください。これにより、検索、レポート、その他のことが大きな問題になります。

テーブル値パラメーターは、SQLServerに複数の行を渡すための最も効率的な方法です。ただし、EFがあなたを追い詰めるのかどうかはわかりません。SQLServerでは、EF/CFではまだできない通常のことがたくさんあると聞いています。

それがどのように機能するか、あなたはテーブルタイプを作成します(私はここでデータ型を推測する必要があります):

CREATE TYPE dbo.StatusData AS TABLE
(
  [day] DATE,
  [time] TIME,
  [status] VARCHAR(32),
  [user_id] INT
);

これは、この情報を格納する予定のテーブルの構造と一致する必要があります(また、同じ列に個別のファクトを格納しないでください)。

これで、これをパラメータとしてストアドプロシージャに追加できます。

CREATE PROCEDURE dbo.SaveStatus
  @s AS dbo.StatusData READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.BaseTable([Day], [Time], [Status], [user_id])
    SELECT [Day], [Time], [Status], [user_id]
    FROM @s;
END
GO

DataTableこれで、C#またはその他の値のコレクションを単一のストアドプロシージャパラメーターに渡すことができます(use SqlDbType.Structured)。

于 2013-01-22T02:05:10.323 に答える
0

データベースにデータを保存する場合は、結果をテーブルに保存します。これはオプション(1)として説明されていると思います。

これにより、追加の処理を行う必要がなくなります。データベース規格ではデータ量は少ないです。

于 2013-01-22T02:05:12.760 に答える
0

何を報告するかによると思います。現在特定のステータスを持っているすべてのユーザーと同様。一定期間中のユーザーのステータス。特定のユーザーが特定の期間に特定のステータスを持っていた時間。

ステータスは外部キーである必要があり、日付と時刻はエポックからのミリ秒であり、30 分に丸められ、(ユーザーが UTC にいる場合) に計算されます。これには、挿入する前により多くのプログラミングが必要ですが、データが大きくなるにつれて、取得のパフォーマンスが向上します。それ。

ミリ秒、userid、および statusid にインデックスを付けます。

記憶が正しければ、パフォーマンス (プーリング、スレッド化) が向上するため、データベース関連の処理を行うクラスを com+ コンポーネントとして作成していました。

于 2013-01-22T02:23:28.153 に答える