0

我有一個應用程序,用戶運行「實驗」,實驗有一些「主題」,每個主題都有一個「設置」被用來研究這個問題)。如何使用數據庫設計「模板」系統

所以我基本上這些表:

Experiment 
---------- 
id (PK) 
name 

Subject 
------- 
id (PK) 
name 
experiment_id (FK) 
setting_id (FK) 

Setting 
------- 
id (PK) 
value_a 
value_b 
value_c 

的關係基本上是這樣的:

Experiment ---* Subject *--- Setting 

一旦用戶創建了一個新的實驗,並增加了一個題目進行實驗,他也需要定義設置(用於研究主題的設備)。

但是,我不想讓用戶每次定義設置,我還想提供一種機制來加載/保存設置模板。

什麼是一個好的數據庫設計呢?我想出了

一切有一些缺點:

  1. 添加「SettingTemplate」表中基本上都有一個名稱+相同 colums的設置。然後行可以被複制。但是,我認爲 複製事情通常不是一個好主意。

  2. 將一個名爲FK的「SettingTemplate」表添加到設置表中的 條目中。但是,這意味着設置/模板的更改 將直接影響所有實驗和周圍的主體。這是我想避免的。

因爲我認爲第二種選擇更糟糕,我更喜歡第一種。但是,我敢打賭有一個更好的方法來做到這一點......你能幫忙嗎?

+1

Postgres支持[表繼承](http://www.postgresql.org/docs/current/static/ddl-inherit.html)。爲'Setting'和'SettingTemplate'創建一個公共父項可以讓你保持結構同步,而不需要顯式複製表定義。 –

+0

謝謝,我還不知道表繼承。這可能對1)中的某些內容有用。 – katzenversteher

回答

1

爲什麼不重用設置表?

User 
---- 
id (PK) 

Setting 
------- 
id (PK) 
user_id (FK) 
setting_name 
value_a 
value_b 
value_c 

用戶創建的設置保存在setting中。

當用戶在窗體上創建一個新的主題時,給他一個選擇框(setting_id, setting_name)以從中選擇,並將選定的setting_id插入到主題行中。

select id, setting_name from setting where user_id = :user_id 

更新:喜歡你感興趣的歷史版本,而不是在我看來。

Setting 
------- 
setting_id (PK) 
setting_name 

SettingVersion 
-------------- 
setting_version_id (PK) 
setting_id   (FK) 
value_a 
value_b 
value_c 

Subject 
------- 
id 
name 
experiment_id  (FK) 
setting_version_id (FK) 

所有的PK必須遞增Ids /序列生成的值。

當用戶想要「創造一個全新的環境」,則必須執行兩個刀片,而不是:

Insert a row into Setting, and grab the setting_id from this insert. 
Insert a row into SettingVersion, using the setting_id from above as the FK in this table. 

當用戶想要「編輯設置」,您執行插入,而不是更新的:

Insert a row into SettingVersion, using the setting_id from the original setting that you want to modify 

創建/ 「修改」 的設置,他可以然後通過使用在他的實驗,一個用戶後:

insert a row into Subject, using the setting_version_id from the particular SettingVersion 

另外,根據您想要做什麼,您可以在Setting中添加一個created_by字段,以指示哪個用戶創建了原始設置;在SettingVersion中添加created_by字段以指示哪個用戶創建了原始的修改後的設置;添加setting_version_number以指示創建特定Setting變體的順序。

+0

這可能是一個選項。但是,我更喜歡所有用戶都可以看到的「全局」模板。 – katzenversteher

+0

@katzenversteher所以你會爲用戶創建模板,並允許他們只使用你的模板,或者你還讓他們創建自己的個人非全局模板? –

+0

我的想法是讓用戶創建,編輯和刪除全局模板。 Wen實際上使用了一個模板,模板的值將被複制,所以如果模板之後被改變,則沒有任何中斷。 – katzenversteher