代码之家  ›  专栏  ›  技术社区  ›  Bernard

存储数据的理想方式是PostgreSQL中的几种可能性之一?

  •  0
  • Bernard  · 技术社区  · 7 年前

    std::variant (但在PostgreSQL中,使用类似变体的结构可能并不理想)。

    例如,假设我有一张桌子 purchases 它有一些列:

    CREATE TABLE purchases (
        purchaseid bigserial,
        buyerid bigint,
        name text,
        ...
    );
    

    每次购买都将通过支票或比特币等少数几种支付方式之一进行支付。每种可能性都有需要保存的不同关联字段。

    通过支票付款需要保存支票号码和银行名称,而通过比特币付款需要保存发送者的比特币地址和返回的比特币地址。

    存储此类数据(并将其与中的每一行关联)的理想方式是什么 购买 只有 支付人 支票 比特币,但不是

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jonathan Willcock    7 年前

    我针对这种情况采取的方法确实如您所建议的那样:您需要一个不同的表来显示支票详细信息、比特币详细信息等。这些表必须包括购买id,并且购买表必须具有paymenttypeid。 然后,当希望查看购买的详细信息时,您需要进行左连接。这里的技巧是在视图中有一个case语句,以便根据您从当前左连接表中选择的paymenttypeid。在执行此操作时,需要确保从明细表中选择相同数量的列,并对类型进行适当调整。

    你会得到这样的结果:

    SELECT p.purchasedate, 
           p.otherfields,
           pt.description,
           case p.paymenttype 
               WHEN 1
                   THEN bd.DetailField1 -- cast if necessary
               WHEN 2
                   THEN cd.DetailField1 -- cast if necessary
               END AS Detail1,
           case p.paymenttype 
               WHEN 1
                   THEN bd.DetailField2 -- cast if necessary
               WHEN 2
                   THEN cd.DetailField2 -- cast if necessary
               END AS Detail2
           FROM purchases p
           inner join paymenttypes pt 
               on p.paymenttypeid = pt.id
           left join bitcoindetails bd 
               on bd.purchaseid = p.id
           left join chequedetails cd 
               on cd.purchaseid = p.id