Mysql

避免 3 個表之間的多對多關係循環

  • December 31, 2020

我正在為空閒 CPU 時間捐贈系統設計一個數據庫。我努力設計數據庫。

問題如下。我有 3 個實體(表):

  • 捐贈者:保存捐贈者資訊
  • 設備:大量各種機器類型(手機、PC、平板電腦……)
  • events:保存有關將收到 CPU 捐贈的事件的資訊。

數據庫所依據的規則是。

  • 每個捐贈者都擁有許多個人設備。
  • 捐贈者可以註冊活動。
  • 通過註冊一個事件,捐贈者可以選擇從哪個設備捐贈 CPU 時間。
  • 捐贈者可以註冊他選擇的盡可能多的活動。
  • 捐贈者可以將設備註冊到多個事件。

起初,除了上面列出的(捐助者、設備、事件)之外,我還創建了 2 個額外的表:

  • 捐助者設備:此表包含客戶擁有的各種設備(電話、PC、電視…)。
  • 捐贈者事件:此表包含在事件中註冊的捐贈者及其參與狀態(待定、拒絕、接受)。

然後我發現這個數據模型與我的案例無關。在這種情況下,我無法知道捐贈者選擇為特定活動捐贈的設備。

以下是我想到的一些解決方案,儘管我不相信它們的最優性。

  • 在客戶端事件表中添加一列,其中包含一個字元串,其中包含捐贈的設備的 ID + 捐贈的 CPU 時間量。
  • 如果是字元串,則使用 JSON 欄位。
  • 添加第三個多對多關係設備-事件-客戶端。

PS:我不依賴關係解決方案,我也可以嘗試其他模型。

解決問題的一種方法是將註冊視為實體:註冊具有捐贈者、事件和一組設備。

捐贈者和註冊的關係是基數1:N(捐贈者可以有更多註冊,註冊涉及唯一捐贈者),事件和註冊之間的關係也是基數1:N,而註冊和設備之間的關係是M :N(在一次註冊中,捐贈者可以提供各種設備,而一個設備可以為不同的事件多次註冊)。

因此,這種情況可以用 5 個表來表示:

Donors(DonorID, other attributes)
Devices(DeviceID, other attributes, OwnerID)
Events(EventID, other attributes)
Registrations(RegID, DonorID, EventID, maybe other attributes, like Status, Date, etc.)
RegistrationsDevices(RegID, DeviceID, maybe other attributes as TimeDonated, etc.)

DonorID主鍵為,主鍵為Donors,外鍵指供體,主鍵為,主鍵為(具有和作為外鍵),主鍵為(以及外鍵)。DeviceID``Devices``OwnerID``EventID``Events``RegID``Registrations``DonorID``EventID``(RegID, DeviceID)``RegistrationsDevices

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