Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

S3 與 Postgres 的比較與應用

最後更新:2025年3月4日資料庫

本文為 圖片上傳 AWS S3 系列教學,第 4 篇:

  1. AWS S3 是什麼?
  2. boto3 與 django-storages:如何在 Django 中對接 AWS S3
  3. AWS S3 與 IAM:圖片上傳功能的權限管理指南
  4. S3 與 Postgres 的比較與應用 👈 所在位置
  5. Amazon S3 物件所有權設定解析
  6. AWS S3「阻止所有公開訪問」設定說明
  7. Amazon S3 儲存桶版本控制完整指南
  8. 如何設定 S3 儲存桶的「預設加密」?—— 初學者指南
  9. S3 儲存桶標籤(Tags)簡單介紹:讓你的 S3 管理更輕鬆!
  10. AWS S3 物件鎖定功能入門指南
  11. AWS S3 公開存取權完整指南
  12. AWS CORS 預檢請求與設定指南
  13. AWS IAM 設定教學:生成訪問密鑰以用於 S3 配置
  14. django-storages 基本配置:讓應用程式連接 S3 存儲桶
  15. Django-storages 的完整配置教學:從隱密性到快取控制
  16. Django-storages 完整配置指南:從文件存儲到訪問路徑
  17. Django-storages 配置:環境變數設定
  18. Django-storages 與 STORAGES 配置:未來相容性的最佳實踐
  19. 如何在 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 是兩個不同層面的設定:

  1. null=True:用於 資料庫層面,例如在 Postgres 中設定欄位是否允許存放空值(NULL)。
  2. 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 的工作。

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

資料庫

目錄

  • S3 跟 Postgres 的比較
  • Postgres:關聯式資料庫
  • S3:文件存儲空間
  • Django 的模型作為橋接
  • blank=True 和 null=True 的用途
  • S3 的角色
  • 白話總結