我编写了一个简单的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个患者)。
答案 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)