如何在SQLite中实施共存关系

问题描述

表格:grouptargetsubgroupsubgroup_target

group有很多target
group有很多subgroup
subgroup有很多subgroup_target
target有很多subgroup_target

我要强制执行的关系是,subgroup的{​​{1}}数始终与其拥有的subgroup_targets的{​​{1}}相同。换句话说,如果一个group有5个targets,则每个group也必须恰好有5个targets。此外,在给定的subgroups中,每个subgroup_targets必须对应一个不同的subgroup(它们基本上是每个{{1} } subgroup_targets)。您可以将target看作是掩盖subgroup's拥有的group's数组的数组。

是否有一种方法来约束数据,使得targets不能存在,除非其相应的subgroup_targets也是如此?例如,如果一个targets有多个group,并且为此target插入了一个新的subgroup_targets,那么,如果有一个新的{还没有为每个group subgroups插入{1}}。

下面您将找到我对该架构的初步设计。如您所见,它允许为target添加group,而无需为每个subgroup_target group's添加相应的链接到其的subgroups。 / p>

target

解决方法

-- Group GRP exists.
--
group {GRP}
   PK {GRP}
-- Subgroup number SG# of group GRP exists.
--
subgroup {GRP,SG#}
      PK {GRP,SG#}

FK {GRP} REFERENCES group {GRP}
-- Target TGT exists.
--
target {TGT}
    PK {TGT}
-- Group GRP is targeting target TGT.
--
group_target {GRP,TGT}
          PK {GRP,TGT}

FK1 {GRP} REFERENCES group  {GRP}
FK2 {TGT} REFERENCES target {TGT}
-- Subgroup number SG# of group GRP
-- is targeting target TGT.
--
CREATE VIEW subgroup_target (GRP,SG#,TGT)
AS
SELECT a.GRP,a.SG#,b.TGT
FROM subgroup     AS a
JOIN group_target AS b on b.GRP = a.GRP ;

注意:

All attributes (columns) NOT NULL

PK = Primary Key
FK = Foreign Key
Using suffix # to save on screen space.
OK for SQL Server and Oracle,for others use _NO.
For example,rename SG# to SG_NO.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...