設計一個 ERD 資料表結構用以存放使用者/網站設定

什麼是 ERD?

這裡有維基百科替你解釋,主要分為實體關聯兩者,我在這裡節錄些重要的段落:

實體(Entity)表示一個離散對象。實體可以被(粗略地)認為是名詞,如電腦、歌曲。

關聯描述了兩個或更多實體相互如何關聯。聯繫可以被(粗略地)認為是動詞,如:在公司和電腦之間的擁有關聯。

說真的這是在供三小我真的毫無頭緒。

我為什麼要用這種方式儲存使用者設定?

我研究了很多儲存設定的方式,發現 ERD 結構是最符合彈性還有儲存大量資料的

起初我想過乾脆建立像下面這樣不斷向水平延伸的使用者資料表。

後來發現這種設計需要不斷地更改資料表結構,而且每當新增一個設定,就需要在網頁上新增給這個設定的 HTML 原始碼,還不僅如此,連 JavaScript 端的表單送出也都還要驗證這個設定,為此我感到十分煩躁,後來就決定改換方式了。

資料庫是用來垂直延伸,不是水平

資料庫的設計本身就是向下延展而不是水平延展,ERD 結構就符合這一點,雖然之後操作 Query 會比較繁雜(因為資料表不同,會有很多 JOIN),但我們可以把 Query 寫成一個 Function 之後重複使用就好了。

下面這是依照 ERD 概念所設計的資料表,你可以在 Database design for user settings 看到更詳細的解說。

這些資料表的實際資料你可以到上面的連結看到。

在這裡針對幾個資料表欄位解說一下,首先 settings 資料表是用來定義有哪些設定的,其中的 constrained 欄位是用來表示:

此選項是否有固定設定值?

讓我們假設你有一個 color 的設定,然後你提供了 grey, white, black 三種選項,這個時候你的 color 就是 constrained因為你預先提供了設定值

那麼什麼是 data_type?主要就是用來定義這個選項的資料型態,例如這一個選項是存放 username,我們希望只有英文字母或數字,那麼就可以把 data_type 設定成 alphanumeric

min_valuemax_value 則是和 constrained 有所關聯,當你沒有固定值(constrainedfalse)時就表示你的設定是一個不定數,你就可以在這裡設定你選項的最小數值還有最大數值避免使用者輸入不定數時超過範圍

接著稍微解釋一下 user_settingsallowed_setting_values 資料表然後我就要回去寫後端了,前者是用來存放使用者所套用的設定,後者則是用來存放選項可用的設定值(也就是上述一直提到的固定值)。

user_settings 裡面可以看到兩個欄位:allowed_setting_value_id, unconstrained_value

選項是固定值的時候我們就會用前者欄位存放固定值的編號,反之,選項是不定值的時候我們就把不定值放在後者欄位

記得,相關的範例都可以在上面的 Stackoverflow 連結看見。


圖示來源:Structure by Xinh Studio from the Noun Project