2

サーバー側コンポーネントとクライアント側コンポーネントの2つのコンポーネントを持つプロジェクトがあります。さまざまな理由により、クライアント側のデバイスはデータベースの完全なコピーを持ち運びません。

私のモデルが2つの側の間に1:1の相関関係を持っていることはどれほど重要ですか?そして、質問を私のより大きな懸念に拡張するために、もしそうでなければ、私が遭遇するであろう時限爆弾はありますか?私はそれぞれの側で異なる情報を持っていることについて話しているのではなく、むしろ情報がカプセル化される方法は異なります。(明らかに、ストレージメカニズムも異なります)サーバー側は、各ユーザー、各レビュー、各「アイテム」を個別のテーブルで保存し、必要に応じてデータを収集するためにそれらの間にリンクを作成します。クライアント側は完全なユーザーデータベースを持っているべきではありませんが、「名前」などを収集するためにユーザーに対してリンクするのではなく、レビューに保存します。言い換えると...

- - サーバ側 - -

Item:+id//アイテムに関する情報を保存する

ユーザー:+ id + Name -Password

レビュー:+ id + itemId + ratio + text + userId

---デバイス側---

アイテム:+ id + AverageRating

レビュー:+ id + ratio + text + userId + name

ユーザー:+ id +Name//スタッフ


基本的な考え方は、特定の「重要な」情報が1レベル上に移動することです。ユーザーは、クエリに関連する「アイテム」のリストを取得し、特定のレビュー指向の情報を上に移動します(つまり、平均評価)。さらに情報が必要な場合は、アイテムの詳細ビューを照会し、実際のレビューが照会されてデータセットに追加されます(表示されます)。彼らが実際のレビューを照会すると、レビューが照会され、途中で追加のユーザー情報が取得されます(おそらく、ユーザーが追加のユーザー情報のいずれかを使用できるかどうかはわかりません)。

私の基本的な懸念は、適切なデータベースの正規化によって情報を本当に下に保存する必要があると示唆されている場合でも、ユーザーの帯域幅やローカルストレージに必要のない多種多様な情報を詰め込みたくないということです。 ' レベル。

これは私が考え/心配しようとしているレベルであるため、かなり低レベルの概念的な問題として表現しましたが、それが重要な場合は、iOS/CoreDataクライアントにデータを提供するPHP/MySQLサーバーを作成しています。

4

1 に答える 1

2

このようにネットワークを介してデータを移動する場合、またはクライアントにすべてではなく一部のみを保存する場合は、分割全体でまったく同じ構造を持たなくても問題ありません。

ただし、何が何であるかについての混乱を避けるために、可能な限り同じ用語同じ名前を使用することをお勧めします。(同じ用語を使用することも、ドメイン駆動設計の本で触れられていることです)

それほど問題にはなりませんが、両端が同じ構造になっているとわかりやすくなります。したがって、これを追求したい場合は、クライアントのモデル自体を単純化するのではなく、転送されるデータにカプセル化を使用することを検討することをお勧めします。

このパターンは通常、データ転送オブジェクトまたはDTOとして知られています。基本的には、これを使用して、ネットワーク上を移動するデータに構造を与え、それをクライアント上で同じモデル構造に分解することができます。PHPでは、連想配列を使用してこの構造を表すことができますが、実際のクラスを使用すると、DTOに割り当てられたデータが期待される形式に準拠していることを確認するのに役立ちます。

于 2012-12-01T23:28:37.407 に答える