我希望有人可以编辑我的标题以更好地描述我的意思,因为我不确切地知道这会被称为什么。但是,请考虑以下设置:我想创建一个通知系统,向用户显示一条消息,直到他点击“关闭”。然后,我需要“记住”该用户已经解除了通知,因此我不再向他展示。这是我目前的解决方案
users
表包含uid
主键和用户信息notifications
表格包含nid
主键和通知文字notifications_seen
表格包含两列,uid
和nid
当有人点击通知被忽略时,我会将uid
和通知的nid
存储在notifications_seen
中。这似乎工作正常,但phpMyAdmin有巨大的红色消息告诉我notifications_seen
没有索引。但是,这两列都不是唯一的。我是否真的在notifications_seen
中有一个完全无用的列并将其称为主键?有更好的方法吗?
答案 0 :(得分:1)
您可以使用多个列来创建主键。在这种情况下,您应该在notification_seen表中将nid AND uid设置为主键。这里的想法是,尽管你的notifications_seen表中nid或uid都不是唯一的; nid / uid PAIR是唯一的。您应该为这两列添加主键约束。这通常是您希望针对这种情况所做的事情。
有时您可能实际上想要创建自动增量行来简化主键。例如,当你的最佳候选键由很多列组成时(我将它拉出空中;但是可以说是4列或更多列)或者你有包含字符串的列;在进行查找时匹配会更慢。但是对于这种情况,只需将主键约束添加到两列就可以了。
默认情况下,主键被编入索引;这就是为什么你应该只将主键约束添加到两列。这还可以确保您不会意外插入具有相同uid / nid对的行,从而保持数据的完整性。
您还应该在uid上为user表中的id添加外键约束,并在通知表中为id上的nid添加外键约束。添加外键约束将确保您不会在notification_seen表中插入实际不存在的uid或nids。
答案 1 :(得分:1)
您可以在notifications_seen
上创建包含两个列的索引!或者只为主键创建一个单独的列,或同时执行这两个操作 - 在uid
和nid
上建立索引可能加快查询速度(但不要过于担心直到你开始注意到主要的性能问题 - 只记得它的未来。拥有这些n:n关系的主键并不是一件可怕的事情。
答案 2 :(得分:1)
您可以创建复合主键(由uid
和nid
组成)。