【问题标题】:Best way to implement many-to-many relationship in MySQL在 MySQL 中实现多对多关系的最佳方法
【发布时间】:2016-08-08 05:42:01
【问题描述】:

我有 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 个用户做这件事。任何人都知道最有效的实现方式吗?

【问题讨论】:

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


【解决方案1】:

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

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

这是一次性操作,对吗?所以它不需要成为软件工程中的杰作。我有时会在 Excel 中逐行加载原始数据,然后编写一个公式,为第一行“计算”适当的 SQL 语句,然后为所有行复制这个公式。然后将所有这些语句扔到数据库中。就算有几万,也不是什么大功夫。

【讨论】:

    【解决方案2】:

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

    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 个用户,因此 tablescan 也会非常快。

    【讨论】:

    • 谢谢。这正是我所需要的。
    猜你喜欢
    • 2011-03-10
    • 2021-10-17
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多