代码之家  ›  专栏  ›  技术社区  ›  Dillie-O

查询字段为列的联合表

  •  2
  • Dillie-O  · 技术社区  · 17 年前

    我不太确定这是否可行,或者是否属于透视表的范畴,但是我想我会去专业人士那里看看。

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

    属性表是基本关键字/值类型表。所以你有了关键字atk和赋予它的值。还有一个名为SpecialType的属性,一张卡可以有多个值,例如“sycnro”和“dark”

    我要做的是创建一个视图或存储过程,该视图或存储过程向我提供卡片ID、卡片名称以及作为列分配给卡片的所有属性关键字及其在指定卡片的结果集中的值。所以理想情况下我会有一个结果集,比如:

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

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

    我想,甚至更为圆滑的方法也只是简单地基于关键字将属性连接在一起,这样我就可以生成如下结果集:

    1  Red Dragon Archfiend   Synchro/DARK/Effect
    

    但我不知道这是否可行。

    帮我把克诺比堆起来!你是我唯一的希望。

    5 回复  |  直到 8 年前
        2
  •  1
  •   Community CDub    8 年前

    相关的,但是值是值保存在单独的列中,并且您已经知道您的“特殊类型”是一个时间头:
    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
    
        3
  •  0
  •   Will    17 年前

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

    您所描述的是一个透视表。数据透视表是 坚硬的 . 如果可能的话,我建议尽量避免。

    为什么不直接读取相关的行并在内存中处理它们呢?听起来你不会花太多的时间来做这个…

        4
  •  0
  •   James A. Rosen    17 年前

    一个选项是让属性具有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”,并枚举值。

        5
  •  0
  •   Dillie-O    17 年前

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

    推荐文章