將具有副檔名的文件作為 BLOB 儲存在數據庫中
最近在開發過程中,我遇到了文件儲存問題。我不確定哪個解決方案是最好的,這就是我決定寫這個問題的原因。我沒有太多數據庫管理經驗,這就是為什麼任何提示對我來說都非常有用的原因。
在我的應用程序項目中,我有幾種類型的文件與特定表有關係,例如:
- 發票有一次掃描
- 使用者有一份文件
- 交易有一張收據
- 建築有很多照片
… ETC。
所有這些文件:
scan | document | receipt | photo
具有不同的副檔名(pdf/jpg/png 等)。我決定將每個表對應的文件儲存為
BLOB
數據類型。由於BLOB
使用,需要在數據庫中的某處儲存文件副檔名。我正在考慮幾個可能的解決方案:(出於展示目的,我將附上簡單的表格視覺化)
使用者 | 發票 | 建築照片 | 交易要求文件儲存為
BLOB
或MEDIUMBLOB
,但缺少文件副檔名。儲存它的最佳方式是什麼?作為VARCHAR
每個表中的列還是單獨的表?每個表中的擴展儲存範例:
此解決方案是最容易實現的解決方案,
VARCHAR
當我插入新數據時,附加副檔名很方便,但我重複此資訊,因為我將有兩個具有相同副檔名的文件。單獨表中的擴展儲存範例:
此解決方案似乎更加優化,但在插入新數據時更難管理。對於上述問題的任何建議,我將不勝感激。
我考慮過的另一種實現是不將所有文件儲存在單獨的表中,而是創建一個名為的表
file
,該表將包含文件BLOB
,然後是發票 | 使用者 | 交易 | 建築物等將與該表有關。下面的視覺化:在這種情況下,我再次將副檔名保存在單獨的表中,但文件數據也是如此。所有文件都在同一個地方,但我最終會得到大表和很多一對一的關係。如果這樣的解決方案也有意義,我會很感激選擇,或者也許有另一種方法來做這樣的事情?
我認為“使用者有一個文件”(以及其他文件)實際上是一個業務規則——您將來可能需要更改的東西,而不是數據規則。因此它應該由觸發器/約束來執行,而不是你的模式
我會使用這樣的架構:
USERS -< USER_DOCUMENTS >- FILES INVOICES -< INVOICE_SCANS >- FILES BUILDINGS -< BUILDING_PHOTOS >- FILES TRANSACTIONS -< TRANSACTION_RECEIPTS >- FILES
文件看起來像這樣:
FILES file_id content_type name data (BLOB)
雖然我們在這裡,但“事務”是數據庫中一個被過度使用的術語。