【问题标题】:SQL - how to keep track of "simple relations"SQL - 如何跟踪“简单关系”
【发布时间】:2011-08-14 20:31:50
【问题描述】:

我希望有人可以编辑我的标题以更好地描述我的意思,因为我不知道这会叫什么。但是,请考虑以下设置:我想创建一个通知系统,在该系统中向用户显示一条消息,直到他单击“关闭”。然后我需要“记住”该用户已关闭通知,因此我不再向他显示。这是我目前的解决方案

  • users 表有一个 uid 主键和用户信息
  • notifications 表有一个 nid 主键和通知文本
  • notifications_seen 包含两列的表,uidnid

当有人在通知上单击解除时,我将他们的uid 和通知的nid 存储在notifications_seen 中。这似乎工作正常,但 phpMyAdmin 有巨大的红色消息告诉我notifications_seen 没有索引。但是,这两列都不是唯一的。我真的应该在notifications_seen 中有一个完全无用的列并将其称为主键吗?有没有更好的方法来做到这一点?

【问题讨论】:

  • 为什么我还要索引呢?
  • 在没有电脑的情况下去图书馆时需要卡片目录的原因相同。您是想查看所有书籍,还是只查看包含所有书籍信息的卡片,当您找到要查找的特定书籍时,这些信息会告诉您书籍在哪里?

标签: sql relation table-structure


【解决方案1】:

您可以使用多个列来创建主键。在这种情况下,您应该将 nid 和 uid 设置为您的 notifications_seen 表中的主键。这里的想法是,即使在您的通知_seen 表中,nid 或 uid 都不是唯一的; nid/uid PAIR 是唯一的。您应该向这两列添加主键约束。对于这种情况,这通常是您想要做的。

有时您实际上可能希望创建一个自动递增行来简化主键。例如,当您的最佳候选键包含很多列时(我将其从空中拉出来;但假设是 4 列或更多列)或者您的列包含字符串;在进行查找时匹配会更慢。但是对于这种情况,只需要在两列中添加主键约束就可以了。

默认情况下,主键被索引;这就是为什么您应该只将主键约束添加到两列。这也将通过确保您不会意外插入具有相同 uid/nid 对的行来保持数据的完整性。

您还应该将uid 上的外键约束添加到users 表中的id 上,并将外键约束添加到通知表中id 上的nid 上。添加外键约束将确保您不会将实际不存在的 uid 或 nid 插入到您的通知_seen 表中。

【讨论】:

    【解决方案2】:

    您可以创建复合主键(由uidnid 组成)。

    【讨论】:

      【解决方案3】:

      您可以在notifications_seen 上创建一个包含两个 列的索引!或者只为主键创建一个单独的列,或者两者都做 - 在uidnid 上有一个索引可能加速查询(但在你开始之前不要太担心)注意到主要的性能问题 - 请记住它以备将来使用)。拥有这些 n:n 关系的主键并不是一件可怕的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多