需要幫助建立一個健全的數據庫模式
我正在為具有 4 種主要內容類型的應用程序編寫後端:消息、文章、執行緒和執行緒回复。現在,這些都儲存在單獨的 MySQL 表中:每種類型的內容都有一個表。
我想在我的應用程序中引入一個審核系統。為此,我將允許使用者報告/標記一段內容。在數據庫中,每個報告都應該連結回原始內容,以便我可以根據需要檢索有關報告內容的資訊。但是,這還需要另外 4 個表:消息報告、文章報告、執行緒報告和回复報告。除了用於引用正確內容(消息、文章、執行緒或回复)的外鍵列之外,這些表中的每一個都將完全相同。
使用這個系統,報告將以多對一的方式保存,這意味著一個單一的內容可以有多個與之關聯的報告。更複雜的是,我還需要能夠收集關於單個內容的數據。例如,假設 ID 為 23 的執行緒收到了許多報告,但版主出現並將內容標記為安全。我需要能夠以某種方式將執行緒 ID 23 的所有報告標記為“安全”。這似乎很難讓我理解,也許我需要另一個表來跟踪這種資訊。
有沒有人對如何為這種情況改進/設計一個健全的數據庫模式有任何建議?我覺得好像我做錯了什麼,這讓事情變得太複雜了。
大多數實體需要一個
thread_id
.如果你想“回复”,你需要一個連結到相同的消息/評論/發布表
parent_id
; 使用 NULL 或 0 表示鏈的開始。由於我不知道你的message和comment和post之間的區別,所以我無法判斷是否將它們放在1,或2,或3個表中;這取決於他們是否有足夠的差異。但
Threads
應該是一個單獨的表格,討論有關消息/評論/文章集的常見資訊。
safe
(和questioned
),正如你所描述的,屬於Threads
. 但是您可能還需要在其他表上設置一個標誌來審查特定項目。顯示執行緒(或執行緒中的一項)的程式碼需要檢查
safe
並user_id
決定該使用者是否可以看到它。(大概 user_id=‘admin’ 可以看到一切。)
如果您有四個現有表格並且在報告中需要相同的數據,我可以在不更改現有表格的情況下想到兩種可能性:
使用鑑別器列
僅使用一個表,但在報告表中使用一個鑑別器列。然後,外鍵由鑑別器組成,它告訴您引用了四個表中的哪一個以及該表中行的 ID。
然後,您可以通過鑑別器和 id 過濾來查找/更新所有報告到執行緒/等。
但是,這不允許外鍵約束
使用父表
四個表中的每一個都有一個表的外鍵
reportable
並報告對該表的引用。但是,要找出 a
reportable
屬於哪個表,您需要查看所有四個表(除非您還添加了一個鑑別器,這將是冗餘資訊)。但是,您可以通過這種方式使用外鍵約束