Mysql

複合vs自動遞增整數作為主鍵

  • April 6, 2018

我正在為移動平台設計一個 MySQL 5.7 數據庫。該平台具有使用者可以添加到“待辦事項”和“已完成”列表中的活動。

我有 3 個表,一個用於活動,其中有一個名為“activityID”的自動遞增主鍵,每個列表有兩個表。出於多種原因,使用者沒有儲存在 MySQL 數據庫中,但有一個 GUID 來標識他們。

我只需要對每個列表表進行 2 個相當簡單的選擇查詢:

  1. 選擇/返回列表中特定使用者的所有活動 ID
  2. 加入活動表和相應的列表表後,選擇/返回特定使用者的所有活動行。

我研究了堆棧交換和其他地方,但在以下問題上發現了相互矛盾的答案:

  • 我應該為列表表使用 userID + activityID 的複合主鍵,還是只使用自動遞增的 int 作為主鍵?
  • 在任何一種情況下,我是否還應該將 activityID 作為每個列表表的活動表的外鍵?(我的理解是我應該提高數據完整性,並在將來需要時利用級聯刪除)

對此的任何建議都非常感謝,我知道一旦數據庫上線,這些事情就很難改變。非常感謝!

正如 Kumar 所說,使用複合主鍵將阻止您擁有兩個具有相同 userID 和 activityID 的條目 - 您必須確定這是否是理想的配置。從邏輯上講,我會說一個使用者可以兩次完成相同的活動,因此“已完成”列表將有兩個條目,都具有相同的 userID 和 activityID。在這種情況下,您將需要一個單獨的主鍵。

通常我會推薦使用activityID作為外鍵。如果您配置ON DELETE CASCADE刪除活動,還將刪除兩個列表中引用此活動的所有條目。但是,我寧願建議使用ON DELETE RESTRICTwhich 將禁止刪除活動,只要任一列表中有相應的條目(這將防止您擁有無法解析活動 ID 的無效列表)。

引用自:https://dba.stackexchange.com/questions/203198