我想存储用户访问过的城市。在个人资料页面中,将列出用户访问过的所有城市。并且会有一个功能,用户可以搜索“谁访问过那个城市”(可以有多个城市搜索)
我打算做一个多对多的关系。
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 亿行将运行插入/删除和选择 - 连接查询。
如果这种方式可行,我应该记住什么以获得最佳性能?表上的索引就足够了吗?如果这种方式可能会导致问题,您还有什么其他的建议?
您如何看待“不将所有关系存储在不同的行中并将它们保存在一个字段中”?
For example;
-----------
UserID
CityIDS (separated by commas)