【问题标题】:SQlite Design AdviceSQlite 设计建议
【发布时间】:2011-10-23 20:24:40
【问题描述】:

处理可能来自两个不同表的表中的外键的最佳方法是什么? 为了更清楚:
T1(id,c1,c2) - c1 和 c2 来自 T2 或 T3
T2(id,name)
T3(id,name)
考虑 T2 和 T3 必须是不同的表。如果c1 来自T1(例如),c2 可以来自T2T3

我应该:

1.创建一个包含关联的新表并让c1c2 指向该表中的一个ID?即T4(id,id_from_T1,id_from_T2_or_T3,what_table)

2。创建 2 列,c1_parentc2_parent,并制定一个约定,如果它是 1,那么它来自 T2,如果它是 2,那么它来自 T3

还是有更好的全新方法?

谢谢。

【问题讨论】:

  • T2和T3结构一样吗?
  • 不,我必须使用 IF 和 CASE。但目前他们都共享比我所需要的名称列。未来不确定。

标签: sql sqlite database-design


【解决方案1】:

条件外键是非标准 SQL。您应该找到一种方法来合并您的 NAMES 表。如有必要,NAMES 可以有一个复合键。

例如,代替 DEFENDERS 和 ATTACKERS 表,您将有一个合并的 PLAYERS 表,其中有一列指示玩家是进攻还是防守:

                          PLAYERS
                          OffenseOrDefense
                          PlayerName
                          primary key(OffenseOrDefense,PlayerName)


                         DREAM TEAM
                         position
                         offenseOrDefense
                         playerName

                         foreign key(offenseOrDefense,PlayerName) references PLAYERS(offenseOrDefense,PlayerName)

【讨论】:

    【解决方案2】:

    没有一个好的机制来保证id 不会在所有三个表中重复。所以你最好使用T1

    T1(id,c1_tbl,c1_id,c2_tbl,c2_id)
    

    或者,重构您的表设计,使给定的外键只能来自一个特定的表。 (我无法提供具体细节,因为您没有描述此架构的目标。)

    当需要JOIN 时,其中任何一个都会让生活更轻松。

    【讨论】:

    • 谢谢迈克。但是你可以根据列来条件 JOIN 吗?
    • 当然。我自己写的SQL不多,但我想它会像SELECT ... FROM T1, T2 WHERE T1.c1_tbl = 1 INNER JOIN T1.c1_id = T2.id左右。 Django contenttypes 框架使用类似的东西。它创建一个表来表示可以以这种方式使用的每个表,并为每个表分配一个 ID 号。然后,您可以使用 table-ID 和 ID-within-table 组合(“通用外键”)引用任何表中的任何记录,从而使表中的 ID 成为标准的自动增量字段。
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2010-11-17
    • 2017-08-29
    相关资源
    最近更新 更多