音楽アプリのスキーマデザインに問題があると思います。
私は3つのコレクションを持っています:Artists
、、。および3つのクラス:、およびTracks
Albums
artists
albums
tracks
からのドキュメントartists
:
[_id] => MongoId Object
(
[$id] => 4ee5bbfd615c219a07000000
)
[freeze] => false,
[genres] => Array,
[hits] => 0,
[name] => Sarya Al Sawas,
[pictures] => Array,
からのドキュメントalbums
:
[_id] => MongoId Object
(
[$id] => 4ee88308615c218128000000
)
[name] => Sabia
[slug] => wafiq-habib-ft-sarya-al-sawas-sabia
[year] => 1999
[genres] => Array,
[pictures] => Array,
[artists] => Array
(
[0] => MongoId Object
(
[$id] => 4ee34a3b615c21b624010000
)
[1] => MongoId Object
(
[$id] => 4ee5bbfd615c219a07000000
)
)
からのドキュメントtracks
[_id] => MongoId Object
(
[$id] => 4ee8a056615c21542a000000
)
[name] => Bid Ashok
[slug] => wafiq-habib-ft-sarya-al-sawas-bid-ashok
[genres] => Array,
[file] => /m/tracks/t.4ee8a05540c624.04707814.mp3,
[freeze] => false,
[hits] => 0,
[duration] => 303,
[albums] => Array
(
[0] => MongoId Object
(
[$id] => 4ee5cbc3615c216509000000
)
)
[artists] => Array
(
[0] => MongoId Object
(
[$id] => 4ee5bbfd615c219a07000000
)
[1] => MongoId Object
(
[$id] => 4ee34a3b615c21b624010000
)
)
まず第一に、その優れたスキーマ設計ですか??!多対多の関係があるため、このスキーマをこのように設計しました。トラックには2人のアーティストがいて、アルバムには2人のアーティストがいる場合があります。
とにかく、特定のトラックに添付されているアルバムのクエリに問題があります。
アーティストページにいるとしましょう
すべてのアーティストのアルバムとトラックを取得する必要があるので、これを行います。
$cursors = array( 'albums' => $this->albums->find(array('artists' => $artist->_id))->sort(array('_id' => -1)), 'tracks' => $this->tracks->find(array('artists' => $artist->_id))->sort(array('_id' => -1)), 'clips' => $this->clips->find(array('artists' => $artist->_id))->sort(array('_id' => -1)) ); foreach($cursors as $key => $cursor) { foreach($cursor as $obj) { $obj['name'] = ($this->lang->get() != 'ar' ? $obj['translated']['name'] : $obj['name']); $obj['by'] = $this->artists()->get($obj['artists'])->toString('ft'); ${$key}[] = $obj; } }
すべてのトラックをループしてアルバム名を取得する必要があります。このアーティストには3000トラックあるとしましょう。非常に遅いと思いますが、...
だから私の質問は:それは良いスキーマ設計ですか?