建模三向关系

问题描述 投票:0回答:2

A有很多B,但每个B只有一个A。 C有很多B,但每个B只有一个C。

A有很多C,但每个C只有一个A。

请注意,从前 2 个断言来看,A 和 C 具有多对多关系。然而,从第3行可以清楚地看出,A和C实际上是一对多的关系。我需要建立一个关系数据库模型,使得 C 拥有的每个 B 实际上也属于 C 所属的同一个 A。

我怎样才能实现这个目标?

relational-database entity-relationship
2个回答
1
投票

当您看到“a”“X-y”“关系”时,问“哪个关系?”。 “X-to-Y”是某种特定关系的属性。 哪一个?

“关系”有两种使用方式。有时它意味着关系。 (如表所体现。表包含满足由表列参数化的某些关联语句的行)。就像关系模型和 ERM 一样。有时它的意思是FK(外键)。 ORM 对此感到困惑。 ERM 经常对此感到困惑。你正在沿着这些混乱的路线使用“has-a”。

如果不知道表所体现的关系是什么,就无法确定键、FK 或约束(包含数量)!

你对“has-a”的使用不清楚,所以我只是猜测你正在谈论的(一些)关系。

is_an_A(a)
    -- a identifies an A-thing
    -- key a
is_a_B(b)
    -- b identifies a B-thing
    -- key b
is_a_C(c)
    -- c identifies a C-thing
    -- key c
blah_blah_about_an_A_and_a_B(a,b)
    -- is_an_A(a) AND is_a_B(b) AND ...a...b...
    -- key b
    -- fk a to is_a_A, fk b to is_a_B
    -- a:b 1:many
something_about_a_B_and_a_C(b,c)
    -- is_an_B(b) AND is_a_C(c) AND ...b...c...
    -- key b
    -- fk b to is_a_B, fk c to is_a_C
    -- b:c many:1

您的数据库中似乎没有 is_as 。但我们可以跟他们讲道理。

现在你第一次提到的关系似乎就是这个可以用其他人表达的关系:

first(a,c) ==
    EXISTS b such that
        blah_blah_about_an_A_and_B(a,b)
    AND something_about_a_B_and_a_C(b,c)
    -- key c
    -- fk a to is_an_A, fk c to is_a_C
    -- a:c is 1:many

由于其组成关系的多样性,这“可能”是多对多,但我们不知道它是否真的比这更受限制,而不知道实际关系以及可能出现的情况。但当你说“A和C实际上具有一对多关系”时,你似乎仍在谈论这种关系。这种关系用这张表来体现: SELECT a,c FROM blah_blah_about_an_A_and_B NATURAL JOIN something_about_a_B_and_a_C

但可能还有其他关系。

对于我上面的“关于”关系,或者可能是那些将事情推向另一个方向的关系,您使用的“属于”含糊不清。

related_in_reverse_B_A(b,a) -- blah_blah_about_an_A_and_B(b,a)

再次,当您看到“a”“属于”“关系”或“a”“是a”“关系”时,属于和is-a是某些关系的属性。 
哪些?

您似乎对也可以通过上述方式表达的某种其他关系感兴趣。但你甚至不清楚这种关系的参数是什么。我想你指的是这个:

second(b,c) == EXITS a such that blah_blah_about_an_A_and_B(a,b) AND something_about_a_B_and_a_C(b,c) AND first(a,c) -- key c -- fk b to is_a_B, fk c to is_a_C -- b:c is 1:many

关键是 c 是因为 a:c 每个第一个都是 1:many,而 b:c 每个 some_about_a_B_and_a_C 是 1:many。这一点通过表格就可以体现出来

SELECT * FROM blah_blah_about_an_A_and_B NATURAL JOIN something_about_a_B_and_a_C NATURAL JOIN first

因为第一和第二可以由其他人表达,如果在数据库中它们将不是基础而是视图。但我怀疑你实际上被告知它们是可表达的并且意味着查询。

确保您知道如何按照这些思路清楚地重新表述整个消息。总是强迫自己用这些术语来思考。


0
投票

    A
  • 有一个任意候选键,A_id
  • C
  • 有一个候选键 (A_id, C_id),其中 C_id 仅需要对于 A_id 是唯一的
  • C
  • 使用外键 A_id 形式化 <<-->C A
  • B
  • 有一个候选键 (A_id, C_id, B_id) 其中 B_id 仅需要对于 (A_id, C_id) 是唯一的
  • B
  • 使用外键 A_id 形式化 <<-->B A
  • B
  • 使用外键 (A_id, C_id) 形式化 <<-->B C
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.