S3 與 Postgres 的比較與應用
更新日期: 2024 年 12 月 18 日
本文為 圖片上傳 AWS S3 系列教學,第 4 篇:
- AWS S3 是什麼?
- boto3 與 django-storages:如何在 Django 中對接 AWS S3
- AWS S3 與 IAM:圖片上傳功能的權限管理指南
- S3 與 Postgres 的比較與應用 👈 所在位置
- Amazon S3 物件所有權設定解析
- AWS S3「阻止所有公開訪問」設定說明
- Amazon S3 儲存桶版本控制完整指南
- 如何設定 S3 儲存桶的「預設加密」?—— 初學者指南
- S3 儲存桶標籤(Tags)簡單介紹:讓你的 S3 管理更輕鬆!
- AWS S3 物件鎖定功能入門指南
- AWS S3 公開存取權完整指南
- AWS CORS 預檢請求與設定指南
- AWS IAM 設定教學:生成訪問密鑰以用於 S3 配置
- django-storages 基本配置:讓應用程式連接 S3 存儲桶
- Django-storages 的完整配置教學:從隱密性到快取控制
- Django-storages 完整配置指南:從文件存儲到訪問路徑
- Django-storages 配置:環境變數設定
- Django-storages 與 STORAGES 配置:未來相容性的最佳實踐
- 如何在 Django 中移除 DEBUG URL 的靜態檔案配置
建議閱讀本文前,先閱讀完 圖片上傳功能 系列文
在 Django 中,S3 和 Postgres 雖然是不同性質的工具,但透過 Django 模型 的設定,它們可以協同合作,用於處理不同類型的資料。
本文將介紹它們的差異、欄位設置邏輯,以及 S3 的角色與設計,並釐清兩者的關聯。
S3 跟 Postgres 的比較
Postgres:關聯式資料庫
Postgres 是一種 關聯式資料庫,專門用來存儲 結構化資料。
你可以將資料想像成 Excel 表格,每一欄的內容需要事先設定規則,例如:
- 欄位是否允許空值?(
null=True
) - 欄位的格式是文字、數字還是日期?
由於每一欄的內容都需要事先設定,null=True
的設定至關重要,它決定欄位是否可以存放空值(NULL
)。
S3:文件存儲空間
S3 則是一種 文件存儲空間,用來存放檔案(例如圖片、PDF 等非結構化資料)。
S3 的邏輯和 Postgres 不同,它並不需要事先設定欄位規則。
- 檔案存放在指定路徑,這個路徑由 Key 來表示,例如:
uploads/myphoto.jpg
- S3 只負責檔案的存儲與管理,不會檢查或干涉欄位的「空值」狀態。
Django 的模型作為橋接
Django 的模型(models.py
)會協助我們設定並管理 Postgres 和 S3:
- Postgres:設定欄位規則,例如是否允許空值(
null=True
)。 - S3:設定檔案儲存邏輯,例如透過
upload_to
參數決定存檔位置。
舉例來說:
photo = models.ImageField(upload_to="uploads/", blank=True, null=True)
null=True
:Postgres 允許photo
欄位沒有值(空值)。blank=True
:Django 表單允許用戶不選擇圖片上傳。upload_to
:指定檔案上傳到 S3 的路徑。
blank=True
和 null=True
的用途
blank=True
和 null=True
是兩個不同層面的設定:
null=True
:用於 資料庫層面,例如在 Postgres 中設定欄位是否允許存放空值(NULL
)。blank=True
:用於 表單驗證層面,決定 Django 表單是否允許欄位留空。
對 S3 的影響
由於 S3 本身是文件存儲空間,不關心欄位規則,也不會主動檢查「空值」狀態。
因此,null=True
和 blank=True
的設定 僅在 Django 和 Postgres 層面發揮作用,與 S3 無關。
- 當欄位為空時,Django 會根據
null=True
設定將其記錄為NULL
(Postgres),但 S3 不會有任何動作。 - S3 只會在檔案確實上傳時,存放到指定路徑。
S3 的角色
S3 的主要功能是「檔案存儲」,其角色包括:
- 當用戶上傳檔案時,S3 根據
upload_to
路徑儲存檔案。 - 當用戶沒有上傳檔案時,Django 根據
null=True
和blank=True
設定來記錄欄位的狀態(例如記錄為NULL
)。
因此,S3 不會決定欄位是否可以留空,這完全是由 Django 和 Postgres 的設定來控制的。
白話總結
S3 和 Postgres 雖然性質不同,但透過 Django 的設定,它們可以協同運作:
- Postgres:需要透過
null=True
設定欄位是否允許空值。 - S3:只負責存放檔案,與欄位是否允許空值無關。
- Django:透過
blank=True
和null=True
控制欄位規則,並橋接 Postgres 和 S3。
null=True
的設定只對 Postgres 有效,對 S3 沒有任何影響。當你設定 blank=True
和 null=True
時,Django 幫你處理資料庫層面與表單邏輯,S3 只負責將檔案存放到指定位置。
總結來說:S3 不關心欄位的「空值」設計,這是 Django 和 Postgres 的工作。