簡體   English   中英

關系數據庫設計,用於在幾列中重復數據

[英]Relational Database design for repeat data in a few columns

這是我正在使用的數據類型:有用戶數據,例如電子郵件ID,年齡等:

並且有特定於應用程序的設置數據(不透明度,速度,音量等),這些數據具有默認值,但用戶可以自由更改默認值並根據需要定制應用程序。

我希望可以選擇更改現有用戶的默認值,而無需在users表中針對每個用戶進行更改。

有什么好的方法?

  1. 我是否應該將所有數據與一個配置文件包含在一個表中,該配置文件包含默認值和一個名為default_settings的標志(是/否)。
 Table: USERS user_data_1|user_data_2| ... |setting_1|setting_2| ... |default_settings 
  1. 還是我應該將所有用戶數據都放在一個表中,並將其鏈接到另一表上的相應設置數據,而設置表的第一行包含默認值。 沒有設置的分類。 它是默認設置還是一組自定義值
 Table: USERS user_data_1|user_data_2| ... |setting_id Table: SETTINGS setting_id|setting_1|setting_2| ... 

謝謝。

您的第一個設計更具關系性。 每個設置都屬於其自己的列,並具有適當的列名稱,數據類型和DEFAULT 我認為不需要最后一列default_settings 每列要么具有DEFAULT值,要么具有非默認值。

但是,該設計的缺點是,每當需要引入新設置時,都需要使用ALTER TABLE添加新列。 並且表中的列數有實際的限制。 可能有多值設置,很難在一列中建模。

對於用戶設置,我經常看到的是第二個表,該表引用了第一個表。 每個用戶在第二個表中都有很多行,每個設置一行:

Table USERS
user_data_1|user_data_2| ...

Table SETTINGS
user_id|setting_name|setting_value

這種設計允許僅通過插入新行就可以為每個用戶啟用無限數量的新設置,而無需使用ALTER TABLE添加新列。

默認值保存在應用程序代碼中。 也就是說,對於每個設置,如果給定用戶的數據庫中不存在該設置,則應用程序代碼將采用合理的默認值。

此設置表基本上是一個“鍵值”存儲,它具有不同的問題:

  • 每個設置名稱都冗余存儲在一行中,而不是作為列標題存儲。 設置名稱的拼寫可能會變得不一致,例如“顏色”與“顏色”。
  • 您必須為支持任何設置的設置值選擇一種數據類型,這樣您就失去了執行數字或日期格式的SQL支持。 即,一切都變成了字符串。
  • 您將無法將DEFAULT存儲在列定義中。
  • 您將失去使用NOT NULLUNIQUEFOREIGN KEY類的SQL約束的能力。

但是,這種模式在這種情況下仍然非常流行。

基於@BillKarwin的建議。 我決定選擇選項1。

Table: USERS

user_data_1|user_data_2| ... |setting_1|setting_2| ...  

設置列中的默認值將為NULL,表示需要從配置文件中讀取這些設置。 如果用戶自定義設置,則NULL將替換為用戶定義的值。 這樣可以方便地在每個設置的基礎上為所有用戶在一個位置更改默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM