1

私は、それぞれが複数の画像を持つ複数の「アイテム」があるという点で、ショッピング Web サイトまたはソーシャル Web サイトのスキーマと多少似ている SQL Server (2012) データベース スキーマを持っていますが、各画像について約 10 の異なるサイズの画像を保存します。 .

私の計画は、すべての画像データを保持するテーブルを 1 つ、元の画像ごとに 1 つの行を用意することでした。列名:

ImageID
PostID (foreign key)
OriginalImageWidth
OriginalImageHeight
OriginalImageFileUrl
ImageSizesJSON (nvarchar(MAX))

最後の列ImageSizesJSONには、そのアイテムのサイズ変更されたさまざまな (アップロード時に自動サイズ変更) 画像を表す JSON オブジェクトの配列が格納されます。たとえば、次のようにします。

[{ "height": 1536, "width": 2048, "source": "images/post/1/2048x1536.jpg" },
{ "height": 960, "width": 720, "source": "images/post/1/960x720.jpg" },
{ "height": 720, "width": 540, "source": "images/post/1/720x540.jpg" }]

これは特に、次のすべてを回避するためです。

  1. 過剰なデータベース呼び出し/テーブル結合 (さまざまなサイズを照会する必要がないため) - つまり。元の画像のデータベースを画像サイズのデータ​​に非正規化する
  2. すべてのイメージ サイズのファイル システムの不要な読み取り、および関連する (メタ) データ ストレージの場所 (DB およびファイル システム) の切断
  3. さまざまな画像サイズを処理するための不要なアプリケーション コード (すべての画像サイズを処理するために実行する必要があることはすべて、アップロード時およびバッチ スクリプトで実行できます (画像サイズ配列を JSON にシリアル化し、DB に保存することを含む))。

私は .NET (4.5)、Entity Framework (最新 - 5.0 だと思います (番号付けがわかりにくい))、および Web API を使用して、JSON AJAX Web サービスを Web ベースのモバイル アプリに返します。

ただし、POCO のシリアル化後またはシリアル化中に、SQL Server 列 'ImageSizesJSON' から返された JSON と Web API による JSON 出力を組み合わせる際に問題が発生しています。

それらを組み合わせるためにさまざまな方法を試しましたが、それぞれに克服できない問題があり、どちらが最善の方法なのかわかりません。

  1. 列を CLR として扱うだけstringです。このメソッドの問題は、JSON が Web サービスによって返されるときに、JSON が (予想どおり) 文字列として扱われ、二重引用符がエスケープされ、JSON 全体が引用符で囲まれているなどで、見つからないことです。純粋なJSONとして出力する方法であり、出力方法を回避する他の方法は不明です。多分これはJavaScriptで適切に処理できます..?
  2. JSON を POCO オブジェクトにシリアル化し、それを Web API の LINQ to EF クエリに「追加」して、JSON として出力するために再シリアル化します (これは不要な二重のオーバーヘッドであることがわかりますが)。これを実行しようとすると、「このメソッドはストア式に変換できません」または「プリミティブ型または列挙型のみの定数値を作成できません」など、シリアル化された JSON を LINQ to EF クエリに追加するときにさまざまなエラーが発生します。タイプはこのコンテキストでサポートされています。これらのエラーが発生する理由は理解していますが、それらを (エレガントに) 回避する方法もわかりません。

多くのグーグルの後、私はこの時点で進行するためだけに、非正規化された画像サイズのテーブルスキーマを一時的に放棄するところまで来ていますが、このアプローチは私にとって最良のアプリアーキテクチャのようであり、その方法を知りたいですそれを行うには(さらに、他の人も便利だと思うと思います)、ソリューションへのポインタ、または理想的には私が言及した問題のいずれかを処理するためのコードをいただければ幸いです。

ご意見ありがとうございます。

4

1 に答える 1

0

stringオプション#1(JSON文字列を保持する列を.NET型として扱う)を使用して、私の問題に対する答えを見つけました。Web API Web サービスを呼び出す JavaScript/AJAX では、次のようにImageSizesJSON列を参照するだけで済みましたJSON.parse()

var imagesJson = JSON.parse(ImageSizesJSON);

これにより、JSON のエスケープ文字列が JSON オブジェクトに変換され、JavaScript でオブジェクトとして正しく処理できるようになります。

于 2013-08-19T21:12:59.050 に答える