【问题标题】:What database schema should I use?我应该使用什么数据库架构?
【发布时间】:2011-11-29 19:04:01
【问题描述】:

我需要帮助设计一个 SQL 表。假设我有 cardnumbercardtype、field1、field2 和 field3。

Cardtype 是一个枚举,可以是“前”、“后”或“两者”。

  1. 我想从某个表或视图 WHERE cardnumber=XXX 中选择 front.field1、front.field2、front.field3、back.field1、back.field2、back.field3。

  2. 大多数记录将只包含 field1、field2、field3 和“both”,表示我应该让 front.field1 与 back.field1 等...当我选择时。当“前”和“后”不同时,我需要两行具有相同的卡号,但一行带有“前”,另一行带有“后”,以及每一侧的相应字段1...字段3。

如何设计这张桌子。我应该使用某种内部联接的视图还是某种左/右联接?

我对不同的设计持开放态度,但我希望任何设计都易于维护(考虑到大多数记录将是包含“两者”的一行)并且能够满足我的 SELECT 要求。

【问题讨论】:

    标签: sql database-schema


    【解决方案1】:
    Card
    --------------------------------------------
    CardNumber     CardType_id    field1     etc
    
    CardType
    --------------------------------------------
    ID     Description
    
    
    SELECT
         Card.*,
         CardType.Description
    FROM Card
              INNER JOIN CardType
                    ON Card.CardType_id = CardType.ID
    WHERE CardType.Description = 'your description value'
    

    【讨论】:

    • 好的 - 这几乎给了我想要的东西 - 我最终得到了所有 4 个排列:前/前、前/后、后/前和后/后,但这很容易通过向 WHERE 语句添加过滤器以仅返回 4.tyvm 中的 1 个进行更正。
    【解决方案2】:

    您似乎已经有了设计想法并正在寻找查询。我添加了 create table/insert 语句来显示我对问题的解释。这假设了许多完整性项目,例如:

    • 如果您有一张卡的“FRONT”记录,您也将拥有一个(并且 只有一个)卡片的'BACK'记录。我

    • 如果您的卡有“BOTH”记录,则不会有其他记录

    使用 Postgresql 运行:

    CREATE TABLE card(cardnumber int, cardtype varchar(5), field1 varchar(16), field2 varchar(16), field3 varchar(16));
    
    INSERT INTO card VALUES(1, 'FRONT', 'a', 'b', 'c');
    INSERT INTO card VALUES(1, 'BACK',  'd', 'e', 'f');
    INSERT INTO card VALUES(2, 'BOTH',  'x', 'y', 'z');
    
    
    SELECT c1.cardnumber
          ,c1.field1 AS frontField1, c1.field2 AS frontField2, c1.field3 AS frontField3
          ,c2.field1 AS backField1, c2.field2 AS backField2, c2.field3 AS backField3
      FROM card c1
          ,card c2
      WHERE c1.cardtype = 'FRONT'
        AND c2.cardtype = 'BACK'
        AND c1.cardnumber = c2.cardnumber
    UNION
    SELECT c.cardnumber
          ,c.field1 AS frontField1, c.field2 AS frontField2, c.field3 AS frontField3
          ,c.field1 AS backField1, c.field2 AS backField2, c.field3 AS backField3
      FROM card c
      WHERE c.cardtype = 'BOTH';
    
     cardnumber | frontfield1 | frontfield2 | frontfield3 | backfield1 | backfield2 | backfield3
    ------------+-------------+-------------+-------------+------------+------------+------------
              1 | a           | b           | c           | d          | e          | f
              2 | x           | y           | z           | x          | y          | z      
    

    【讨论】:

    • 啊 - 是的:联合也很好用。你的建议。
    猜你喜欢
    • 2011-12-12
    • 2012-06-19
    • 1970-01-01
    • 2011-10-24
    • 2012-10-02
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多