【问题标题】:Query a union table with fields as columns查询以字段为列的联合表
【发布时间】:2010-09-06 07:15:09
【问题描述】:

我不太确定这是否可能,或者是否属于数据透视表的类别,但我想我会去找专业人士看看。

我有三个基本表:Card、Property 和 CardProperty。由于卡片没有相同的属性,而且同一属性通常有多个值,因此我决定使用联合表方法来存储数据,而不是在卡片表中使用非常大的列结构。

属性表是一个基本的关键字/值类型表。所以你有关键字 ATK 和分配给它的值。还有一个名为 SpecialType 的属性,一张卡片可以有多个值,例如“Sycnro”和“DARK”

我想做的是创建一个视图或存储过程,它为我提供卡 ID、卡名称和所有分配给卡的属性关键字,作为指定卡的 ResultSet 中的列和它们的值。所以理想情况下,我会有一个类似的结果集:

ID  NAME                   SPECIALTYPE
1   Red Dragon Archfiend   Synchro
1   Red Dragon Archfiend   DARK
1   Red Dragon Archfiend   Effect

我可以这样计算我的结果。

我想更巧妙的方法是根据关键字将属性简单地连接在一起,这样我就可以生成如下所示的 ResultSet:

1  Red Dragon Archfiend   Synchro/DARK/Effect

..但我不知道这是否可行。

帮助我 stackoverflow 克诺比!你是我唯一的希望。

【问题讨论】:

    标签: sql database-design stored-procedures


    【解决方案1】:

    不要通过连接来折叠以存储数据库中的相关记录。它不完全是最佳实践。

    您所描述的是一个数据透视表。数据透视表很难。我建议尽可能避免使用它们。

    为什么不直接读取相关行并在内存中处理它们?听起来您不会花费太多毫秒来执行此操作...

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      一种选择是让 Properties 有一个 PropertyType,所以:

      table cards
      integer ID | string name | ... (other properties common to all Cards)
      
      table property_types
      integer ID | string name | string format | ... (possibly validations)
      
      table properties
      integer ID | integer property_type_id | string name | string value
      foreign key property_type_id references property_types.ID
      
      table cards_properties
      integer ID | integer card_id | integer property_id
      foreign key card_id references cards.ID
      foreign key property_id references propertiess.ID
      

      这样,当你想设置一个新的属性值时,你可以通过它的类型来验证它。一种类型可能是带有值枚举的“SpecialType”。

      【讨论】:

        【解决方案4】:

        相关但值是保存在单独列中的值,并且您已提前了解您的“特殊类型”:
        SQL query to compare product sales by month

        否则我会在存储过程中使用光标执行此操作,或者在业务或表示层中执行转换。

        如果你知道所有情况,请在 sql 中使用:

        Select
            ID,NAME
            ,Synchro+DARK+Effect --  add a some substring logic to trim any trailing /'s
        from
            (select
                ID
                ,NAME
                --may need to replace max() with min().
                ,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
                ,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
                ,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
            from
                table
            group by
               ID
               ,NAME) sub1
        

        【讨论】:

          【解决方案5】:

          我的属性表确实有一个类型/格式,这样我就知道在处理整数值时如何进行转换/评估。我不确定它是否与这个问题有关。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-12
            • 1970-01-01
            • 2013-04-18
            相关资源
            最近更新 更多