2011-04-28 27 views
0

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

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

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

+0

为什么我甚至想要索引? – Mala 2011-04-28 16:22:02

+0

当你去一个没有电脑的图书馆时,你会想要一张卡片目录的原因是一样的。你宁愿去看看所有的书籍,或者只是看看有关所有书籍的信息的卡片,这些书籍会告诉你,当你找到你要找的特定书籍时,书籍在哪里? – Dave 2011-04-28 19:42:51

回答

1

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

有些时候您可能真的想创建一个自动增量行来简化主键。例如,当你的最佳候选键包含很多列时(我把它从空中拉出来;但是让我们说4列或更多列),或者你有包含字符串的列;这在查找时会比较慢。但是对于这种情况,只需将主键约束添加到两列应该不会太好。

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

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

1

您可以对notifications_seen进行索引,其中包含两列均为列!或者为主键创建一个单独的列,或者同时创建一个列 - 在uidnid之间建立索引可能加快查询速度(但不要担心太多,直到您开始注意到重大性能问题 - 只需记住它为将来)。拥有这些n:n关系的主键并不是一件可怕的事情。

1

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