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点。然后,应用程序不必跟踪数据库中数据的布局方式,如果有机会出现,就可以更容易地进行改进。

相关问题