Mysql

需要幫助建立一個健全的數據庫模式

  • January 18, 2022

我正在為具有 4 種主要內容類型的應用程序編寫後端:消息、文章、執行緒和執行緒回复。現在,這些都儲存在單獨的 MySQL 表中:每種類型的內容都有一個表。

我想在我的應用程序中引入一個審核系統。為此,我將允許使用者報告/標記一段內容。在數據庫中,每個報告都應該連結回原始內容,以便我可以根據需要檢索有關報告內容的資訊。但是,這還需要另外 4 個表:消息報告、文章報告、執行緒報告和回复報告。除了用於引用正確內容(消息、文章、執行緒或回复)的外鍵列之外,這些表中的每一個都將完全相同。

使用這個系統,報告將以多對一的方式保存,這意味著一個單一的內容可以有多個與之關聯的報告。更複雜的是,我還需要能夠收集關於單個內容的數據。例如,假設 ID 為 23 的執行緒收到了許多報告,但版主出現並將內容標記為安全。我需要能夠以某種方式將執行緒 ID 23 的所有報告標記為“安全”。這似乎很難讓我理解,也許我需要另一個表來跟踪這種資訊。

有沒有人對如何為這種情況改進/設計一個健全的數據庫模式有任何建議?我覺得好像我做錯了什麼,這讓事情變得太複雜了。

大多數實體需要一個thread_id.

如果你想“回复”,你需要一個連結到相同的消息/評論/發布表parent_id; 使用 NULL 或 0 表示鏈的開始。

由於我不知道你的message和comment和post之間的區別,所以我無法判斷是否將它們放在1,或2,或3個表中;這取決於他們是否有足夠的差異。但Threads應該是一個單獨的表格,討論有關消息/評論/文章集的常見資訊。

safe(和questioned),正如你所描述的,屬於Threads. 但是您可能還需要在其他表上設置一個標誌來審查特定項目。

顯示執行緒(或執行緒中的一項)的程式碼需要檢查safeuser_id決定該使用者是否可以看到它。(大概 user_id=‘admin’ 可以看到一切。)

如果您有四個現有表格並且在報告中需要相同的數據,我可以在不更改現有表格的情況下想到兩種可能性:

使用鑑別器列

僅使用一個表,但在報告表中使用一個鑑別器列。然後,外鍵由鑑別器組成,它告訴您引用了四個表中的哪一個以及該表中行的 ID。

然後,您可以通過鑑別器和 id 過濾來查找/更新所有報告到執行緒/等。

但是,這不允許外鍵約束

使用父表

四個表中的每一個都有一個表的外鍵reportable並報告對該表的引用。

但是,要找出 areportable屬於哪個表,您需要查看所有四個表(除非您還添加了一個鑑別器,這將是冗餘資訊)。

但是,您可以通過這種方式使用外鍵約束

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