簡體   English   中英

數據庫表設計困境,很多復選框?

[英]database table design dilemma, a lot of check boxes?

我想先說謝謝你們,你們對我都很好。

我會直接回答這個問題。

擁有超過400列的表是不是很糟糕?

我的網頁表單主要包含需要復選框答案的問題。 如果不是更多,復選框的總數最多可以運行400。

我實際上對其中一個表單進行了建模,並將每個復選框放在一列中(花了我幾個小時的時間)。 由於我不熟悉數據庫設計,我覺得這不是正確的方法。

所以我讀到某些人使用序列化函數,將一組復選框存儲為列中的文本。

我只是想知道這將是存儲這些復選框的最佳方式。

哦,以及更多信息我將使用cakephp orm與這些表。

再次感謝您的提前。

我的數據庫看起來像這樣

表:患者,表:admitForm,表:SomeOtherFOrm

每個表格表都有一個PatientId

如上所述,我首先嘗試為每個表單創建一個表,然后將每個復選框放在一列中。 這讓我永遠這樣做。

所以我讀了一些每個問題的序列化復選框是個好主意

所以即時通訊將是一個很好的方法。

對於有多個選項的問題,只需添加另一個表。

沒有人問你的問題是你需要進行數據挖掘還是將這些復選框問題的答案放入查詢中的where子句中。 如果您不需要查看查看這些答案中包含的數據的數據,那么您只需將它們序列化為幾個字段即可。 你甚至可以將它們打包成數字。 (如果打包數據,所有追隨你的人都會討厭你)

這是我對架構的看法。

數據庫架構圖示

我想我會把它分成3個表。 一個表代表任何實體正在回答問題。 第二個表格包含問題本身。 最后,每當第一個表中的實體選中該問題的復選框時,將使用第一個表的主鍵和第二個表中的問題的id填充第三個聯結表。

通常400列意味着您的數據可以更好地規范化並分成多個表。 但是,根據用例,400列可能實際上是合適的。 可能適合的一個示例是,如果您在每個查詢上都需要這些字段,並且需要使用這些列過濾記錄(即:在WHERE子句中使用它們)......在這種情況下,SQL JOIN可能會更昂貴比擁有人口稀少的“寬”桌子。

如果您永遠不需要使用SQL根據這些“復選框”過濾掉記錄(我猜它們是/不是boolean / tinyint類型值),那么序列化是一種有效的方法。 如果我需要在查詢表的大部分時間使用復選框值,我會去這條路線,但不需要在WHERE子句中使用它們。

如果您不需要這些復選框值,或者只需要一小部分復選框值,對表的大多數請求,那么您可能應該將表分成多個表。 一種方法是使用具有復選框值(id,record_id,checkbox_name,checkbox_value)的表,其中record_id是主表記錄的id 這意味着主要記錄與復選框值之間存在一對多關系。

==編輯#3 ==更新了ERD,能夠存儲自由格式答案,還將patient_reponse_option鏈接到question_option_link表,以便用正確的選項上下文保存患者響應(我們知道響應也是哪個問題)。 我很快就會發布一些問題。

在此輸入圖像描述

==編輯#2 ==

使用表單數據更新了ERD

在此輸入圖像描述

==編輯#1 ==

對你的問題的簡短回答是否定的,400列不是正確的方法。 作為替代方案,請查看以下架構:

在此輸入圖像描述

==原文==

根據您最近的編輯,您將需要合並數據透視表。 樞軸表打破了'患者'和'選項'之間的M:M關系,例如,許多患者可以有很多選擇。 為此,您不需要包含400列的表,只需要包含上述數據透視表。

示例模式:

// patient table
tableName: patient
id: int(11), autoincrement, unsigned, not null, primary key
name_first: varchar(100), not null
name_last: varshar(100), not null

// Options table
tableName: option
id: int(11), autoincrement, unsigned, not null, primary key
name: varchar(100), not null, unique key

// pivot table
tableName: patient_option_link
id: int(11), autoincrement, unsigned, not null, primary key
patient_id: Foreign key to patient (`id`) table
option_id: Foreign key to option (`id`) table

使用此模式,您可以擁有任意數量的“選項”,而無需向患者表添加新列。 如果您有大量的行,那么如果您必須運行alter table add column命令,則會破壞您的數據庫。

我在數據透視表中添加了一個id,所以如果你需要處理單個行,它們將更容易使用,而不必知道patient_id和option_id。

暫無
暫無

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

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