具有数千列的数据库表

时间:2018-10-11 10:46:01

标签: database-design

我编写了一个简单的Django应用,该应用显示了表中的值。 该表非常简单,与其他表没有任何关系,所有值都是整数:

patientID    region1 region2 regionN region200000
patient1          30      23       9           14
patient2           1      12       9           22
patientN          23      21      12            8

唯一的问题是我有约20万个基因组区域-这是固定数目(仅患者人数在增加)。

该表的最佳数据库系统是什么?数据是超级结构化,简单且同质的-非常适合SQL,但建议的数量应该是noSQL?

最好有1个具有200000列的表,然后有N个具有200000行的表(N个患者)。

2 个答案:

答案 0 :(得分:7)

该设计不是“对SQL完美”,因为它违反了数据库规范化的基本规则。而且没有关系数据库支持单个表200000列(大多数表的限制在1500到2000列左右)

即使区域的数量是“固定的”,在关系数据库中,对于每个“固定的”对象也不应有一列。

这是经典的多对多关系,通常以三个表为模型。

一个用于患者,一个用于区域:

create table patient 
( 
   id integer primary key, 
   ... other columns
);

create table region
(
   id integer primary key, 
   ... other columns
);

然后,您需要在患者和区域之间建立映射表:

create table person_region_map
(
   person_id integer not null references person,
   region_id integer not null references region,
   primary key (person_id, region_id)
);

该地图可确保由于两个列上的主键,区域和人员的每种组合仅出现一次。


另一种选择是利用当今非常普遍的关系数据库中的JSON功能。它对您是否可用在很大程度上取决于您所使用的实际DBMS产品。

在PostgreSQL中,您可以考虑以下内容:

create table patient 
( 
   id integer primary key, 
   regions jsonb,
   ... other columns
);

然后,您将插入一个JSON值,其中包含区域的键/值映射。这样做还有一个好处,就是如果未将区域分配给区域,则不会占用空间:

insert into patient (id, regions)
values (42, '{"region1": 30, "region10": 9}');

使用Postgres可以很有效地索引和查询。

答案 1 :(得分:2)

我建议使用多对多关系

enter image description here