【问题标题】:MySQL two-column table as primary keyMySQL 两列表作为主键
【发布时间】:2019-02-07 17:02:02
【问题描述】:

我有一个非常简单的想法:保存用户“成就”的表格。就这么简单:

user_id | achievement_id
    1   |    1
    1   |    2
    1   |    5
    2   |    2
    2   |    3

我所需要的只是用户 ID,如果他已经获得了成就 ID。我需要选择的是SELECT achievement_id WHERE user_id=x。所以不需要我永远不会使用或知道它包含什么的人工自动增量列。但是需要设置主键,所以问题是 - 制作这样的 2 列表并将两列都设置为多列主键是个好主意吗?我已经有一组 3 列的表,其中 2 是主键,因为它是逻辑...嗯,对我来说是逻辑,但是对于数据库?

【问题讨论】:

  • " 但是需要设置主键,所以问题是 - 制作这样的 2 列表并将两列都设置为多列主键是个好主意吗?"没有人能回答这个问题,因为我们不知道您要查询
  • 但我在那里做了例子:SELECT achievement_id WHERE user_id=x。除了插入数据之外,这就是我要做的所有事情。

标签: mysql primary-key


【解决方案1】:

这些类型的表在 n-n 关系、多值属性和弱实体的情况下很常见。它与其建模有很大不同,但是是的,在某些情况下它是一个很好的解决方案。主键通常是列的关系。在您的情况下,它将是 user_id 和 achievement_id。

【讨论】:

    【解决方案2】:

    是的,因为这样一组 n 键的规则是:“我只想要一种具有这组 (a,b) 键的记录”。 -> 因此您将无法添加两次“Mario,成就 1”。

    主键将是(PlayerID,AchievementID)。

    如果你想添加一些关于这个成就的信息(例如,玩家获得成就的时间),只需这样做:(PlayerID,AchievementID,Date)和PlayerID,成就ID作为主键。

    希望对你有所帮助。

    【讨论】:

    • 确实如此,谢谢。这只是我第一次遇到整个表是主键的情况,所以我不确定这是否是一个错误。而且我很可能会在那里添加 Date - 这听起来是件好事。谢谢。
    猜你喜欢
    • 2012-06-29
    • 2011-07-21
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多