Postgresql

針對不同數量關係的數據庫設計

  • May 8, 2017

我目前正在嘗試設計一個數據庫模型來儲存所有可能的營養數據,但是對於許多產品來說,沒有其他產品那麼多可用的數據,因此許多欄位可能最終成為 NULL 值(我不希望使用任何占位符/預設值,因為我需要能夠區分哪些是實際缺失的)

我發現 PostgreSql 對我來說可能是一個很好的解決方案,因為我不想建構 EAV(實體-屬性-值)表,因為我有過使用它的經驗,它不能很好地擴展。(如果“產品”可以有 0 到 200 個屬性,它會很快進入數千萬行)。

PostgreSql 具有復合類型,您也可以將它們儲存為數組,這使我可以輕鬆地將鍵值對儲存在單個列中,因此可以輕鬆查找與“產品”相關的所有內容,我可以輕鬆地進行連接表之間,並有可用的數據。

現在的問題是:

這是一個好的解決方案,我會面臨什麼樣的障礙,我的問題是否有更好的解決方案?

會有單獨的表格,例如:

CREATE TABLE products (
   proteins_id FOREIGN KEY,
   lipids_id FOREIGN KEY,
   minerals_id FOREIGN KEY,
   vitamins_id FOREIGN KEY)

每個外鍵引用一個表,一行中最多有 50 個空值

要麼

CREATE TYPE custom_type (
  field_1 INTEGER,
  field_2 INTEGER
)

CREATE TABLE products (
   proteins custom_type[],
   lipids custom_type[],
   minerals custom_type[],
   vitamins custom_type[]
)

我知道通過找到某種平衡,最佳解決方案可能介於這兩個解決方案之間,但我真的需要一些指示,謝謝你們!:)

編輯:加上另一件要考慮的事情:表格可能需要經常擴展,如果這個過程最不痛苦,那就太好了。

我也面臨與其他表格(例如(食物)“食譜”)相同的問題,因為成分的數量可能非常不同,而且我需要儲存組件的度量/數量。

您所描述的稱為子類型。子類型是一種常見的資料結構,用於非常相似但有一些差異的事物。例如,名為 Clothing 的對象可用於描述多種類型的個人覆蓋物,但 T 恤和短褲具有非常不同的屬性。使用子類型,您可以將所有常見屬性儲存在一個表中,並擁有一個包含不同屬性的相關表。該主表將具有類型表的 FK,該表將指示該對像是哪個子類型表。

實體:服裝 ClothingID ClothingTypeID -> ClothingType 名稱 尺碼 顏色

類型實體: ClothingType ClothingTypeID 名稱

現在對於子類型表。類型表中的每個值都有一個。

實體:TShirt ClothingID(子類型始終具有與父對象相同的主鍵值)SleeveLength ColorType

實體:短褲 ClothingID HasPockets LegLength IsSwimSuit

引用自:https://dba.stackexchange.com/questions/173004