S3 與 Postgres 的比較與應用

更新日期: 2024 年 12 月 18 日

在 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=Truenull=True 的用途

blank=Truenull=True 是兩個不同層面的設定:

  1. null=True:用於 資料庫層面,例如在 Postgres 中設定欄位是否允許存放空值(NULL)。
  2. blank=True:用於 表單驗證層面,決定 Django 表單是否允許欄位留空。

對 S3 的影響

由於 S3 本身是文件存儲空間,不關心欄位規則,也不會主動檢查「空值」狀態。

因此,null=Trueblank=True 的設定 僅在 Django 和 Postgres 層面發揮作用,與 S3 無關。

  • 當欄位為空時,Django 會根據 null=True 設定將其記錄為 NULL(Postgres),但 S3 不會有任何動作。
  • S3 只會在檔案確實上傳時,存放到指定路徑。

S3 的角色

S3 的主要功能是「檔案存儲」,其角色包括:

  • 當用戶上傳檔案時,S3 根據 upload_to 路徑儲存檔案。
  • 當用戶沒有上傳檔案時,Django 根據 null=Trueblank=True 設定來記錄欄位的狀態(例如記錄為 NULL)。

因此,S3 不會決定欄位是否可以留空,這完全是由 Django 和 Postgres 的設定來控制的。


白話總結

S3 和 Postgres 雖然性質不同,但透過 Django 的設定,它們可以協同運作:

  • Postgres:需要透過 null=True 設定欄位是否允許空值。
  • S3:只負責存放檔案,與欄位是否允許空值無關。
  • Django:透過 blank=Truenull=True 控制欄位規則,並橋接 Postgres 和 S3。

null=True 的設定只對 Postgres 有效,對 S3 沒有任何影響。當你設定 blank=Truenull=True 時,Django 幫你處理資料庫層面與表單邏輯,S3 只負責將檔案存放到指定位置。

總結來說:S3 不關心欄位的「空值」設計,這是 Django 和 Postgres 的工作

Similar Posts