0

プロジェクトの MVC パラダイム (CakePHP) を使用して、ソーシャル ネットワーキング サイトのシンプルなデザインを作成しています。すべてのユーザーの詳細を格納する Users というテーブルがあり、すべてのグループの詳細を格納する Groups テーブルがあります。これら 2 つのモデル間の関係は多くのものに属しており、グループに属するすべてのポートフォリオを格納する group_portfolios テーブルと、ユーザーに関連するすべてのポートフォリオ情報を格納する user_portfolio テーブルがあります。ユーザーは複数のポートフォリオを持つことができます グループは複数のポートフォリオを持つことができます ユーザーは多くのメディアを持つことができます グループは多くのメディアを持つことができます

ユーザーとグループに関連付けられたメディアの機能を分離しました。私の質問は、

1) MVC アプリケーションのモデリングに関して、私は正しい方法で考えていますか?
2) ユーザーとグループの機能を分離しているため、メディアやポートフォリオなど、それらに関連するすべての情報を表す 2 つのテーブルができあがっています。これにより、特にポートフォリオなどを検索するときに、冗長性やパフォーマンスに関連する問題が発生しますか?
3) 後で機能を追加したい場合、これは拡張できますか?
4) システムをモデル化するためのより良い方法はありますか?

ありがとうございました

4

3 に答える 3

1

単一のメディアと単一のポートフォリオテーブルを使用できます。ユーザーまたはグループのどちらに属しているかを示すフィールドを追加します。次に、$ belongsTo属性をモデルに追加せずに、bindModelメソッドを使用して正しいモデルを動的にアタッチします。

または、IDに整数の代わりにUUID(mysql:varchar 36)を使用することもできます。UUIDが衝突することはありません。したがって、同じフィールドを使用して、ポートフォリオとメディアをユーザーとグループに所属させることができます。これが機能するのは、UUIDを使用するときに、グループと同じIDを持つユーザーが存在しないためです。例:

class Media {
    $belongsTo = array(
        'User' => array('foreignKey' => 'parent_id'),
        'Group' => array('foreignKey' => 'parent_id'),
    );
}

前者は技術的にはより正確です。後者の方が実装が簡単で、長いUUIDが作成する長いURLが気に入らない場合があります。

編集:一意性に関するコメントに対処するために、UUIDはグローバルに一意になるように設計されています。つまり、自分のデータベース内に重複がないだけでなく、世界中に重複があってはなりません。どこでも。

UUIDを使用した重複の可能性については、このWikipediaの記事を参照してください。短編小説:70,000億のUUIDを生成した後、重複が1つでも発生する確率は100億分の4です。同じ日に2回落雷する可能性が高くなります:-)

于 2009-05-20T23:47:29.687 に答える
0

私はCakePHPではなくRoRとCastleを使用したので、一般的な用語で話します。

1:これまで行ってきたことと継続して行うべきことは「ドメインモデリング」と呼ばれます-モデルがドメインモデル内のオブジェクトの表現になるため、MVCはこれに最適です

2:ポートフォリオとメディアモデルを、親のIDを参照する代わりに、「ObjectId」と「ObjectType」を使用するように変更できます。ObjectIdは親のIDであり、ObjectTypeはタイプです。関係を自動配線することはできませんが、代わりにカスタムコードを使用して配線することができるため、ユーザーのすべてのメディアを取得するには、次のようになります。

select * from Media where ObjectId = [userid] and ObjectType = 'User'

それ以外の

select * from UserMedia where UserId = [userid]

3:はい、それはスケーラブルな設計です。モデル固有の作業をモデル自体(またはリポジトリ)にプッシュして、「正しく機能する」ようにすることを忘れないでください。

4:たぶん、しかしあなたは「完璧な」システムを決して手に入れません。MVCは素晴らしく、シンプルなソーシャルネットワークのデザインはしっかりしているようです。投稿/コメントなどを追加することは間違いありません。

于 2009-05-20T23:37:27.790 に答える