2009-08-09 44 views
1

我需要創建一個數據庫表,用於存儲假設患者隊列的生理特徵(例如收縮壓,甘油三酯濃度等)的參數化描述。使用可選列正確標準化數據庫

例如,假設用戶爲SBP指定了一個三角形分佈,那麼將不得不存儲最小值,最大值和模式(以及分佈類型)。或者,用戶可以指定正態分佈,需要存儲均值和標準差。

我正在努力用正確的方式來規範化這些數據。目前,我有一個隊列表,並與多家一到一個如下關係的分佈表(某些字段省略):

 
    Cohort 
     id (INT, NOT NULL, PRIMARY) 
     name (TEXT, NOT NULL) 
     comments (TEXT) 
     systolic_blood_pressure_dist (FOREIGN KEY referencing Distributions.id) 
     triglyceride_dist (FOREIGN KEY referencing Distributions.id) 
     ...other physiological parameters 

    Distributions 
     id (INT, NOT NULL, PRIMARY) 
     distribution_type (TEXT) 
     minimum (FLOAT) 
     maximum (FLOAT) 
     mean (FLOAT) 
     mode (FLOAT) 
     sd (FLOAT) 
     ...other distribution parameters (alpha, beta, shape, scale, etc.) 

(distribution_type保存描述分配的字符串:「三角」,「威布爾「等)

我敢肯定,這不是最佳的方式來做到這一點,因爲我留在每個分配行中的NULL字段的負載。

我的其它的想法是爲每個分發類型(一個用於三角,一個用於高斯,一個用於均勻,等)單獨的表,並具有在中間的表的ID柱(用作外鍵入隊列表* _dist列),分配類型列和id列以將行的外鍵存儲在適當的分配表中。

查詢將使用存儲在羣組列中的ID從中間表中查找分佈類型和行ID,然後使用該ID在相應的表中查找參數。但是,使用一個字符串來選擇適當的表,然後另一個id來選擇適當的行遠離傳統的JOIN,也不覺得像一個非常乾淨的方法。

那麼,有沒有人有任何建議如何最好地實現這一點(在規範化和/或性能方面)?

非常感謝, 豐富

回答

1
Cohort 
    id (INT, NOT NULL, PRIMARY) 
    name (TEXT, NOT NULL) 
    comments (TEXT) 

Parameters 
    id (INT, NOT NULL, PRIMARY) 
    name (TEXT, NOT NULL) ("systolic blood pressure", "trygliceride", ...) 

CohortParameters 
    id (INT, NOT NULL, PRIMARY) 
    cohort_id (FOREIGN KEY referencing Cohort.id) 
    parameter_id (FOREIGN KEY referencing Parameters.id) 
    value (TEXT) 

DistributionTypes 
    id (INT, NOT NULL, PRIMARY) 
    name (TEXT, NOT NULL) ("Triangular", "Weibull", ...) 

Distributions 
    id (INT, NOT NULL, PRIMARY) 
    distribution_type_id (FOREIGN KEY referencing DistributionTypes.id) 
    cohort_id (FOREIGN KEY referencing Cohort.id) 
    parameter_id (FOREIGN KEY referencing Parameter.id) 
    minimum (FLOAT) 
    maximum (FLOAT) 
    mean (FLOAT) 
    mode (FLOAT) 
    sd (FLOAT) 
    ...other distribution parameters (alpha, beta, shape, scale, etc.) 
+0

非常感謝您的及時響應!我對解決方案的幾個方面有點不清楚,特別是CohortParameters表 - 它的目的是什麼,價值列的目的是什麼?另外,Distributions表仍然會有NULL值問題(儘管忽略了浪費的空間,但我仍然不相信自己這是一個真正的問題......)。再次感謝您對此的投入,Rich。 – 2009-08-09 21:17:48

0

具有不同的分佈類型不同的表聽起來我的權利。在您的應用程序邏輯中,無論如何(我推測),您必須特別處理每種分發類型,因爲它可能需要UI中的不同渲染或不同的計算。

0

你認爲每個分佈類型都有一個表格可能就是你想要的。這樣,您就有一個定義明確的表格,其中包含您需要的特定於您的分發類型的每個值。這將節省您的空間,將允許您鎖定哪些字段可以爲空或哪些不可用,並且會導致性能提高。如果每個發行版都有一組通用參數,則可以按超類型/子類型關係排列表以進一步標準化該架構。

0

如何查詢時使用數據?

如果您正在查詢多個隊列,並且對於隊列有不同的分佈是合理的,那麼您的結果將是一個「聯合」,實際上許多列將爲空。在這種情況下,你的結果在某種意義上是「不正常的」,但這並不意味着該模式應該是。

對不同分佈類型使用不同表的好處是,每個表都會顯式定義必須填充以描述分佈的列,甚至可以將某些列設置爲「非空」。

我喜歡你的建議的總體思路。

+0

非常感謝回覆(以及上面的Martin和Dave)。我不會經常詢問多個隊列,所以UNION不會參與。我很高興你贊同「不同分配的不同表格」的想法,但我在實施中遇到了問題。 在我的中間表(關聯與分佈隊列),我有dist_ID存儲在列,但我只知道這是指表通過查詢dist_type列。因此,我不能使用任何InnoDB的參考完整性功能,如級聯刪除。有什麼想法嗎?也許另一個問題是爲了... – 2009-08-09 21:29:42

1

您的設計似乎表明,只能有一個單一類型的每測量信息項目分佈數據。在您的設計中,似乎不可能在「收縮壓」上具有「均勻分佈」和「三角分佈」數據。

這似乎表明,對於每個單獨的「測量信息」,你已經知道前期,在系統設計時,什麼樣的分佈數據是可用的。

這反過來似乎表明,沒有必要這樣(以及從關係的角度來看這是完全不好的)這樣做來收集這些不同類型的分佈在一個集合中,只是爲了恢復任何通過添加多餘的「分佈類型」列來進行必要的區分。

EDIT

「的分佈類型列也成爲必要,只要有與不同分佈的生理參數的數據庫的兩個或更多羣組」。

這似乎是廢話。不同的人羣擁有不同的分佈測量ID,而獨特的分佈測量ID可以通過您自己的設計具有不同的分佈類型。

+0

每條測量的信息只能有一個分佈*在任何一個時間*,但分佈類型可以由用戶通過一個網絡接口來改變(取決於它們在臨牀試驗數據使用,例如)。只要數據庫中存在兩個或多個具有不同分佈生理參數的羣組,分佈類型列也是必需的。希望有所幫助。 – 2009-08-09 21:57:47

+0

「不同的人羣擁有不同的分佈測量ID,而獨特的分佈測量ID可以通過您自己的設計具有不同的分佈類型。」爲什麼這要求分發類型列「垃圾」?我仍然需要將每個隊列特徵與其分佈相聯繫,如果每種分佈類型都存儲在不同的表中,那麼我需要一些方法來確定它在哪個表中。雖然確實它不需要在隊列中表格本身,我很確定3NF指示它應該在那裏。 – 2009-08-10 06:36:30