ユーザーが訪れた都市を保存したい。プロファイルページには、ユーザーが訪れたすべての都市が一覧表示されます。そして、ユーザーが「その都市を訪れた人」を検索できる機能があります(複数の都市の検索が可能です)
多対多の関係を築くことを計画しています。
Table Users
-----------
UserID
UserName
...
Table Cities
-------
CityID
CityName
....
Table City_Relations
-----------
UserID
CityID
プロファイルページで、簡単なクエリを実行して都市を取得できます。
select c.cityname FROM city_relations cr left join cities c on ( c.cityid = cr.cityid ) where cr.userid = 'USERID'
そして、検索ページで、選択した都市を訪れたユーザーを取得します。
select u.username FROM city_relations cr left join users u on ( u.userid = cr.userid ) where cr.cityid = 'CITYID' ( there may be cr.cityid = '1' or cr.cityid = '2' and so on; or in()/find_in_set() )
これまでのところ、すべてが大丈夫です。私の質問は、これがどれほど効率的かということです。1億人のユーザーがいると仮定すると、各ユーザーはcity_relationsテーブルに数百の都市を持つことができます。ユーザーごとに100の都市があるとすると、そのテーブルには挿入/削除と選択-結合クエリを実行する100億行があります。
この方法で問題がない場合、最高のパフォーマンスを得るために何を覚えておく必要がありますか?テーブルのインデックスで十分ですか?この方法で問題が発生する可能性がある場合、他にどのような方法を提案しますか?
「すべてのリレーションを異なる行に格納せず、それらを1つのフィールドに保持する」についてどう思いますか?
For example;
-----------
UserID
CityIDS (separated by commas)