0

我想在postgres數據庫中建立以下模型。什麼是設計'行對'關係的正確方法?

我有N個「數據集」。這些數據集是諸如調查結果,國家統計數據,彙總數據等等。它們每個都有一個名稱來源於一個方法等。這是一個數據集的元數據,並且我爲此和表格創建了表格以編纂研究方法等'根'元數據表被稱爲'數據集'。每行代表一個數據集。

然後我需要存儲和訪問與此數據集關聯的實際數據。所以我需要創建一個包含這些數據的表。我如何表示該表與其'Datasets'表中的相應行之間的關係?

示例

'hea'是一組調查回答。它是未分類的,因此每一行都是一個調查回答。我創建了一個名爲「HeaData」的表,其中包含這些數據。

'cso'是一組綜合就業數據。每一行都是一個經濟部門。我創建了一個名爲'CsoData'的表,其中包含這些數據

我在'datasets'表中爲每個數據表創建一行,每個表中都有相關的元數據,它們的ID分別爲1 & 2。

將1與HeaData表和2與CsoData表相關聯的最佳方式是什麼?

我最終將訪問與斯卡拉光滑這個數​​據,所以如果數據庫的設計可能只是「即插即用」用油滑,這將是理想的

回答

0

添加列到數據集表,指定數據集的哪種類型的它代表。那麼1可能意味着HEA,2可能意味着CSO。檢查約束會將字段限制爲兩個值中的一個。如果稍後添加新類型的數據集,則唯一需要更改的是更改約束。如果它被定義爲「數據集類型」表的外鍵,則只需在其中添加新類型的數據集。

在PK和新字段上形成一個唯一索引。

爲每個子表添加相同的字段。但是檢查約束將HEA表中的值限制爲只有那個值和CSO表只有那個值。然後形成數據集表的ID字段和新的字段作爲FK到數據集表。

這將ID值限制爲只有一個子表,並且它必須是在Datasets表中定義的ID值。也就是說,如果您定義ID值爲1000的HEA數據集條目和HEA類型值,則唯一可以包含ID值1000的子表格是HEA表。

create table Datasets(
    ID  int identity/auto_generate, 
    DSType char(3) check(DSType in('HEA', 'CSO'), 
    [everything else], 
    constraint PK_Datasets primary key(ID), 
    constraint UQ_Dateset_Type unique(ID, DSType) -- needed for references 
); 

create table HEA(
    ID  int not null, 
    DSType char(3) check(DSType = 'HEA') -- making this a constant value 
    [other HEA data], 
    constraint PK_HEA primary key(ID), 
    constraint FK_HEA_Dataset_PK foreign key(ID) 
     references Dataset(ID), 
    constraint FK_HEA_Dataset_Type foreign key(ID, DSType) 
     references Dataset(ID, DSType) 
); 

與CSO子表相同的想法。

我會推薦HEA和CSO視圖,它將顯示連接在一起的完整數據集行,元數據和特定於類型的數據。使用這些視圖上的觸發器,它們可以是應用程序代碼的DML點。然後,應用程序不必跟蹤數據庫中數據的佈局方式,如果有機會出現,就可以更容易地進行改進。

相關問題