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

Postgresql 如何将具有n列的表映射到数据库?,postgresql,database-design,cassandra,nosql,data-modeling,Postgresql,Database Design,Cassandra,Nosql,Data Modeling,我们目前正在使用PostgreSQL,现在必须在数据库中保存一些表。表一经创建就不会更新,但可能会被过滤 表格本质上是动态的,因为可能有n列 因此,一个表格将是: |------|--------|--------| | NAME | DATA 1 | DATA 2 | |------|--------|--------| |------|--------|--------|--------|--------|--------| | NAME | DATA 1 | DATA 2 | DATA

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

表格本质上是动态的,因为可能有
n

因此,一个表格将是:

|------|--------|--------|
| NAME | DATA 1 | DATA 2 |
|------|--------|--------|
|------|--------|--------|--------|--------|--------|
| NAME | DATA 1 | DATA 2 | DATA 3 | DATA 4 | DATA 5 |
|------|--------|--------|--------|--------|--------|
另一个表格是:

|------|--------|--------|
| NAME | DATA 1 | DATA 2 |
|------|--------|--------|
|------|--------|--------|--------|--------|--------|
| NAME | DATA 1 | DATA 2 | DATA 3 | DATA 4 | DATA 5 |
|------|--------|--------|--------|--------|--------|
数据没有标准化,因为处理
n
行时会受到伤害,因为所有行都是一次性读取的

这些是我提出的解决方案

  • 以JSON类型或HStore对将表另存为JSON
  • 将表格另存为文本字段中的CSV数据

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

    动态列意味着无模式是我们应该寻找的选项。MongoDB是首选。我们是否存储为JSON?如果是这样,Mongo将有助于操纵数据/提取/报告,使生活更轻松

    如果您不熟悉NOSQL。MSSQL 2016以后的列中JSON存储支持为varchar(MAX)。SQLServer提供了处理JSON数据的函数。尽管默认情况下nvarchar是基于文本的索引。SQL支持基于计算列的索引,这将有助于处理JSON中的元素外观。允许任何数量的非聚集索引计算列,这将简化处理JSON数据的索引。
    SQL2019对JSON有更多的支持,正如您所描述的,这听起来像是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来标识每个子表,并将子表的行存储在这个one-db表中

    这带来了一些可能性:

    • 创建一个单独的表来存储关于每个子表的元数据。例如,子表的模式可以存储在这里,用于应用程序层验证
    • 大型/热门子表上的部分索引:
      create index test\u 1\u movie\u name on test((数据->'name')),其中tableid=1
      

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

    “创建后从未更新,但可能被过滤”的表几乎不是“动态的”。除非你隐瞒了重要的细节,否则就只有这些了

    除非有超过100列。见:


    (但您后来最多评论了12条,这一点都没有问题。)

    Postgres比SQL Server更好地支持JSON。Postgres获得本机json类型,而SQL Server将其作为VARCHAR,因此索引很糟糕。我认为任何其他nosql sb都可以满足这一需求。感谢您的输入。SQL Server-计算列索引将有助于删除文本索引。如果您不使用MongoDB,Couchbase是另一个NOSQL选项。创建后如何查询表?为什么不在需要时发布DDL来创建它们?@Deena“Postgres获得了本机json类型,而SQL Server将其作为VARCHAR来执行,因此索引很糟糕”任何特定示例?将JSON存储为VARCHAR没有什么错。平心而论。@LukaszSzozda没有索引,每次查询数据时,SQL Server都必须执行一次完整的表扫描,这就是varchar类型在JSON中的糟糕之处。当您说这些表可能会被过滤时,您是指对多个表还是其中一个表进行查询?你们有什么性能要求?序列扫描可以吗?我们谈论的表/行中的表/列的数量是多少,千/百万?查询将在每个表上完成,而不是针对多个表。列的数量可以是
    n
    其中
    n<12
    大多数情况下,行可能是数千行,但不超过十万行。您的问题是关于无模式表的功能吗?我的意思是,您想在同一个表中存储具有不同列数的行,还是每个表都应该具有静态列数?