A有很多B,但每个B只有一个A。 C有很多B,但每个B只有一个C。
A有很多C,但每个C只有一个A。
请注意,从前 2 个断言来看,A 和 C 具有多对多关系。然而,从第3行可以清楚地看出,A和C实际上是一对多的关系。我需要建立一个关系数据库模型,使得 C 拥有的每个 B 实际上也属于 C 所属的同一个 A。
我怎样才能实现这个目标?
当您看到“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
因为第一和第二可以由其他人表达,如果在数据库中它们将不是基础而是视图。但我怀疑你实际上被告知它们是可表达的并且意味着查询。
确保您知道如何按照这些思路清楚地重新表述整个消息。总是强迫自己用这些术语来思考。