0

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

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

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

4

3 回答 3

1

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

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

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

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

于 2011-04-28T15:58:51.813 回答
1

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

于 2011-04-28T15:59:02.747 回答
1

您可能能够创建复合主键(由uid和组成nid)。

于 2011-04-28T15:59:13.633 回答