【问题标题】:How to mark selected columns of a table for display如何标记表格的选定列以供显示
【发布时间】:2018-06-10 05:49:23
【问题描述】:

我使用 PostgreSQL 10.1 并且:

CREATE TABLE human
(
    id        ... NOT NULL,
    gender    ...,
    height    ...,
    weight    ...,
    eye       ...,
    hair      ...,
    ...
);

我有一个输入表单,我可以通过它插入数据。我希望有一种优雅而适当的方式,我可以SELECT以那种形式DISPLAYED需要哪些列,例如weight ... DISPLAYED,eye ... NOT DISPLAYED,

  • 一种方法是将 NULLDISPLAYED 对应(当 NOT NULL 时显示它,或者当 NULL 时不显示它)并使用 information_schema这(相应)让我不那么高兴:

  • 另一种方法是:

    CREATE TABLE human_column
    (
        id                ... NOT NULL,
        characteristic    character varying(...),
        is_displayed      boolean
    );
    

    其中characteristic数据是human表的列名。

有没有更好的方法将直接外部属性添加到表的列中? (在51.7. pg_attribute 中有一个名为attoptions 的列。会用吗?)

【问题讨论】:

  • 您肯定不应该更新pg_attribute。并且您可以将自定义“属性”添加到列中 - 因此只需将列表保存在某处即可。但是您需要动态创建一个视图或类似的东西,然后返回一个想要的列表。否则,如果列表不可修改 - 只需创建一个视图?..
  • 你可以编写自己的“语言”并使用每列 COMMENT 进行注释。虽然有点脆弱
  • 我认为这与您的应用程序的持久层(数据库)无关。相反,它与您的服务器高度相关。
  • 对不起,我误删了答案!
  • @VaoTsun:我同意,VIEW 似乎是最优雅、最可靠的解决方案。

标签: database postgresql database-design


【解决方案1】:

为列指定“选项”以定义它们是否将被“显示”似乎有点开销。想象一下,您将此类列表保存在 human_column 中。要对其进行修改,您需要使用新的 is_displayed 值对其进行更新。然后您需要构建要在查询中选择的列列表。

当您创建视图时,您执行相同的操作(指定要显示的列列表)然后您可以只查询视图,而无需动态构建查询。您还可以随时从目录或信息架构中检查包含列的当前列表。

视图的唯一“不舒适”功能 - 您无法更改其中的列,因此您必须删除并重新创建它。

按需删除/创建视图对我来说看起来更便宜,然后在每个选择上使用列列表动态构建查询。

演示:

db=# create view v as select oid,datname from pg_database;
CREATE VIEW
db=# select * from v;
  oid  |  datname
-------+-----------
 13505 | postgres
 16384 | t
     1 | template1
 13504 | template0
 16419 | o
(5 rows)

检查列列表:

db=# select column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length from information_schema.columns where table_name = 'v';
 column_name | ordinal_position | column_default | is_nullable | data_type | character_maximum_length
-------------+------------------+----------------+-------------+-----------+--------------------------
 oid         |                1 |                | YES         | oid       |
 datname     |                2 |                | YES         | name      |
(2 rows)

原表相同:

db=# select column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length from information_schema.columns where table_name = 'pg_database';
  column_name  | ordinal_position | column_default | is_nullable | data_type | character_maximum_length
---------------+------------------+----------------+-------------+-----------+--------------------------
 datname       |                1 |                | NO          | name      |
 datdba        |                2 |                | NO          | oid       |
 encoding      |                3 |                | NO          | integer   |
 datcollate    |                4 |                | NO          | name      |
 datctype      |                5 |                | NO          | name      |
 datistemplate |                6 |                | NO          | boolean   |
 datallowconn  |                7 |                | NO          | boolean   |
 datconnlimit  |                8 |                | NO          | integer   |
 datlastsysoid |                9 |                | NO          | oid       |
 datfrozenxid  |               10 |                | NO          | xid       |
 datminmxid    |               11 |                | NO          | xid       |
 dattablespace |               12 |                | NO          | oid       |
 datacl        |               13 |                | YES         | ARRAY     |
(13 rows)

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2018-07-11
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多