0

我必须在我的数据库中实现以下内容:

  • 用户参与的活动。每个活动的名称最多可包含 80 个字符,并且只应存储不同的活动。也就是说,如果两个不同的用户喜欢“Swimming”,那么“Swimming”活动应该只作为字符串存储一次。

  • 每个用户都参与了哪些活动。请注意,一个用户可以有多个爱好!

因此,我必须为此目的实现表,如果需要,我还必须对现有表进行任何修改,并实现所需的任何键和外键关系。

所有这些都必须以最少的存储量存储,即,您必须从 MySQL 手册中选择适当的数据类型。您可能会假设新活动会频繁添加,活动几乎不会被删除,并且不同活动的总数可能会达到 100,000。

所以我已经有一个以“user_id”作为主键的“用户”表。

我对此的解决方案:
创建一个名为“Activities”的表,并将“activity_id”作为 PK (mediumint(5)),将“activity”作为存储爱好 (varchar(80)),然后我可以创建另一个名为“Link”的表并使用用户表中的“user_id”外键和“活动”表中的“活动ID”外键向用户显示他们喜欢做的活动。

我对这个问题的处理方法正确吗?还有其他方法可以提高效率吗?

如果一个用户在外键表“链接”中进行不止一项活动,我将如何显示?

4

1 回答 1

0

你的想法是正确的,也是唯一的(?)方式..它被称为多对多关系。

重申一下您的建议是,您将有一个用户表,这将有一个用户 ID,然后是一个带有活动 ID 的活动表。

要形成关系,您将拥有第三张表,出于性能考虑,它不需要主键,但是您应该索引两列(用户 ID 和活动 ID)

在您的逻辑中,当有人输入活动名称时,从活动表中提取所有记录,检查输入的值是否存在,如果不添加到表并取回新的活动 ID,然后将条目添加到将活动 ID 链接到用户 ID 的 user_activity 表.

如果它已经存在,只需添加一个将该活动 ID 链接到用户 ID 的条目。

所以你的方法是正确的,最后一个问题只是表明你应该在谷歌上搜索“多对多”关系以获取更多信息。

于 2012-08-13T04:26:12.160 回答