【问题标题】:SQL issue - type of fkeySQL 问题 - fkey 的类型
【发布时间】:2017-08-05 11:12:34
【问题描述】:

我正在使用 PostgreSQL

我需要什么

在 SELECT 查询中,我需要选择 owner_type(客户端或域)。如果解决方案不存在,请帮助我修改此架构。

架构(表)

  1. 专辑 - id | client_id (fkey) | domain_id (fkey) |名字
  2. 客户 - id |名字 |姓氏
  3. 域 - id |姓名

描述:相册所有者可以是客户端未来的其他节点...

1。创建表查询

CREATE TABLE albums 
  ( 
     id        BIGSERIAL PRIMARY KEY, 
     client_id BIGINT, 
     domain_id BIGINT, 
     name      VARCHAR(255) NOT NULL, 
     FOREIGN KEY (client_id) REFERENCES clients(id), 
     FOREIGN KEY (domain_id) REFERENCES domains(id), 
     CHECK ((client_id IS NULL) <> (domain_id IS NULL)) 
  ); 

2。选择查询

SELECT albums.id, 
       albums.name, 
       COALESCE(c.id, d.id) AS owner_id 
FROM   albums 
       LEFT JOIN clients c 
              ON albums.client_id = c.id 
       LEFT JOIN domains d 
              ON albums.domain_id = d.id 

需要类似 -> if c.id === null -> owner_type = 'Domain'

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需结果。

标签: sql postgresql


【解决方案1】:

你似乎想要:

SELECT a.id, a.name, 
       COALESCE(c.id, d.id) AS owner_id,
       (CASE WHEN c.id IS NOT NULL THEN 'client' ELSE 'domain' END) as owner_type
FROM albums a LEFT JOIN
     clients c 
     ON a.client_id = c.id LEFT JOIN
     domains d 
     ON a.domain_id = d.id ;

【讨论】:

    【解决方案2】:

    您是否需要两个单独的列来表示所有者类型的 client_iddomain_id?似乎如果要添加更多节点,则必须添加其他列。

    您能否有一个代表所有类型所有者的owners 表,并在albums 表上有一个owner_id 外键?

    我在想这样的事情:

    CREATE TABLE albums ( 
        id    BIGSERIAL PRIMARY KEY, 
        owner_id    BIGINT,
        name    VARCHAR(255) NOT NULL, 
        FOREIGN KEY (owner_id) REFERENCES owners(id)
    );
    
    CREATE TABLE owners ( 
            id    BIGSERIAL PRIMARY KEY, 
            type    VARCHAR(100) NOT NULL,
            name    VARCHAR(255) NOT NULL
        );
    

    然后您可以查询属于客户的相册:

    SELECT a.id, a.name, o.name AS owner_name
    FROM albums a
    JOIN owners o ON o.id = a.owner_id
    WHERE o.type = 'Client';
    

    添加新节点(所有者类型)时,您只需将它们添加到owners 表中,而无需修改albums 表的架构。

    希望这会有所帮助。

    【讨论】:

    • 好的,但我需要在所有者表中添加一些外键。简而言之,此 ID 必须存在(clientId、domainId...)。
    猜你喜欢
    • 2011-07-07
    • 2015-03-07
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多