我正在設計一個簡單的媒體「服務器」作爲更大的應用程序的一部分。我選擇採用與AWS S3服務類似的術語,即Objects和Buckets(即文件和目錄)。什麼是可以「被丟棄」的對象的合適的桌子設計
我有兩個表:
cdn_bucket
id, directory
和
cdn_object
id, bucket_id, filename, is_deleted
數據庫中的其他表可以使用上cdn_object.id
外鍵包含的對象。這有很好的副作用,因爲我可以指定一個約束來在刪除對象的情況下設置字段NULL(或者實際上防止刪除,如果需要的話)。 e.g:
blog_post
id, title, body, featured_image
CONSTRAINT: featured_image = cdn_object.id ON DELETE SET NULL
有人告訴我,一旦我不應該刪除的東西,永遠(這是另一篇文章的說法,請不要在這裏發表評論);因此is_deleted
標誌。爲了澄清這個問題,這就是我所說的「被濫用」,即可以恢復的意思。
這很好,但是我不能利用約束的級聯功能(即我將一個對象標記爲已刪除,但引用表,例如blog_post.featured_image
引用舊的ID)。
我想知道SO的意見可能會對以下兩種方法產生什麼影響,或者如果有另一種方法可能會更好。
1.加入cdn_object表
SELECT bp.*, cdno.id featured_image FROM blog_post bp JOIN cdn_object cdno ON cdno.id = bp.featured_image AND cdno.is_deleted = 0
。專業:易於實施。
Con:每個查詢都必須加入
cdn_object
表。
或
2.使用垃圾表
有另一個表,
cdn_object_trash
,並讓代碼「搬家」的行cdn_object
當它刪除,引發所有級聯約束。臨:允許關係規則做他們的目的是做
缺點:不好的設計?不確定。
我的直覺告訴我,我應該使用is_deleted
標誌並編寫相應的代碼,但是這是一個通用類,所以我寧願不強迫開發者編寫的參加每一次,如果我可以配置數據庫中的邏輯。
我希望我的情況/問題很明確,如有需要,請讓我澄清任何問題。
謝謝你,你碰到了頭腦 - 我希望儘可能容易爲未來[不勤奮]開發者寫查詢;而且我知道他們不會做得很好。我傾向於選項2,垃圾表有效地作爲對象表的副本。在課堂上寫幾條額外的句子來處理這個問題*我認爲*是一個可以接受的折中方案? – HelloPablo
我的理論家對此妥協不寒而慄,因爲它最終會引導您製作數據庫中每個表的重複副本。您需要決定如何以及爲什麼要傳輸數據,以及如何鎖定數據,以便人們不會在臨時或未來的開發中使用它。 –
我認爲這是可行的,如果您的桌子數量有限,並且您有遠見建立一些維護功能(滾出比特定日期更早的數據等) –