2011-04-28 32 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組成)。