在MySQL中实现多对多关系的最佳方式

时间:2016-04-16 06:22:51

标签: mysql database database-design many-to-many relational-database

我有2个表,用户(约1000个用户)和国家(约50个国家/地区)。用户可以支持许多国家/地区,因此我计划创建映射表user_country。但是,由于我有1000个用户和50个国家/地区,因此该表最多可包含50000个条目。这是实现这个的最佳方法还是有更适合的方法?

如果这是最好的方法,我如何只使用一个SQL语句将支持多个国家/地区的用户添加到此表中? 例如:

INSERT INTO user_country(userid, countrycode)
VALUES ('user001','US'),
('user001','PH'),
('user001','KR'),
('user001','JP')

如果用户支持所有50个国家/地区,则上述SQL语句将会过长。我必须为1000个用户做这件事。任何人都有任何想法是实现这一目标的最有效方法吗?

2 个答案:

答案 0 :(得分:1)

从数据库设计的角度来看,像user_country这样的表是唯一合理的方法。对于MySQL来说,50000条记录是轻而易举的,将它们与适当的索引结合在一起将为将来使用这些数据开辟各种方式。

据我所知,这与许多大型SQL插入语句的问题无关。无论您如何表示数据库中的数据,您都必须编写包含每个用户国家列表的语句。

这是一次性行动,对吧?因此,它不需要成为软件工程的杰作。我有时会做的是逐行加载Excel中的原始数据,然后编写一个“计算”第一行的相应SQL语句的公式,并为所有行复制此公式。然后将所有这些语句抛出数据库。即使有成千上万的,也没多大功夫。

答案 1 :(得分:0)

我个人会根据选择进行插入:

INSERT INTO user_country SELECT 'user001', countryid from countries WHERE countryid IN ('US', 'PH', 'KR', 'JP');

您需要适应您的列名。

将国家/地区列表usercountries varchar (255)存储为US,FR,KR等的替代方案也是可行的 - 但您将无法根据其支持的国家/地区选择用户。事实上你不会失去它 - 但

SELECT * FROM users WHERE usercountries like '%KR%';

就索引使用而言,这不是一个好的查询。但是,由于您只有1000个用户,因此表格扫描也会非常快。