Mysql
避免 3 個表之間的多對多關係循環
我正在為空閒 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