如何将具有n列的表映射到数据库?

时间:2019-03-02 10:02:05

标签: postgresql database-design cassandra nosql data-modeling

我们当前正在使用PostgreSQL,现在必须将一些表保存在数据库中。这些表一旦创建就永远不会更新,但可能会被过滤。

表实际上是动态的,因为可能有n列,

因此表将是:

|------|--------|--------|
| NAME | DATA 1 | DATA 2 |
|------|--------|--------|

另一个表是:

|------|--------|--------|--------|--------|--------|
| NAME | DATA 1 | DATA 2 | DATA 3 | DATA 4 | DATA 5 |
|------|--------|--------|--------|--------|--------|

数据未规范化,因为在处理n行时会很麻烦,因为一次读取所有行。

这些是我想出的解决方案,

  1. 将该表另存为JSON类型或HStore对中的JSON。
  2. 将该表另存为“文本字段”中的CSV数据

存储上述数据的替代方法有哪些? NoSQL数据库可以处理这些数据吗?

3 个答案:

答案 0 :(得分:2)

我在您的问题中看不到任何东西会阻止您使用具有相应数据列数的普通表。这是迄今为止 的最有效的存储形式。最小的存储空间,最快的查询。

“一旦创建就永远不会更新,但可能会被过滤”的表几乎不是“动态的”。除非您不保留所有必要的详细信息,否则就全部存在。

并且除非可以有多于100列。参见:

(但是您以后最多评论了12条,这完全没问题。)

答案 1 :(得分:1)

根据您的描述,这听起来像是jsonb的工作。假设name在某个表中是唯一的,我可以想象是这样的:

create table test (
  tableId integer,
  name text,
  data jsonb,
  constraint pk primary key(tableId, name)
);
insert into test values (1, 'movie1', '{"rating": 10, "name": "test"}');
insert into test values (1, 'movie2', '{"rating": 9, "name": "test2"}');
insert into test values (2, 'book1', '{"rank": 100, "name": "test", "price": 10}');
insert into test values (2, 'book2', '{"rank": 10, "name": "test", "price": 12}');

基本上,这个想法是使用tableId标识每个子表,并将子表的行存储在此一个db表中。

这带来了一些可能性:

  • 创建一个单独的表来存储有关每个子表的元数据。例如,可以将子表的架构存储在此处以进行应用层验证。
  • 大/热子表上的
  • 部分索引:create index test_1_movie_name on test ((data->>'name')) where tableid = 1

答案 2 :(得分:0)

动态列表示减少模式是我们应该寻找的选项。首选MongoDB。我们存储为JSON吗?如果这样的话,Mongo将有助于Manipulatin的数据/提取/报告将使生活更加轻松。

如果您不熟悉NOSQL。支持MSSQL 2016及更高版本中的JSON存储为varchar(MAX)。 SQL Server提供了处理JSON数据的功能。即使默认情况下nvarchar是基于文本的索引。 SQL支持基于计算列的索引,这将有助于处理JSON中的元素外观。允许使用任意数量的非聚集索引计算列,这将简化索引处理JSON数据的过程。 SQL 2019对JSON提供了更多支持