查询在多个表上链接多对多关系

时间:2013-02-18 23:24:49

标签: sql database oracle many-to-many subclass

我正在制作测验计划。在测验中我有很多参与者,但另一方面,参与者可以输入许多测验(随着时间的推移)。所以我已经通过链接表克服了这种多对多的关系。到目前为止,我可以理解......现在我遇到困难:参与者可以是一个团体,也可以是一个团体。

所以测验有一个参与者(带有一个链接表),这个参与者是一个有几个人的团体,或者这个参与者是一个玩家,只有一个人。

table Quiz : PrimaryKey = quiz_id, (name, date,... )
table QuizParticipant : PrimaryKey = quiz_participant_id, quiz_id 
table ParticipantGroup : PrimaryKey = quiz_participant_id, group_id
table participantPlayer : PrimaryKey = quiz_participant_id, person_id

我的问题是:如何通过q​​uiz_id查询测验的所有参与者,最好按类型(组或玩家)对其进行排序?

关于如何谷歌这些东西的提示也很有用:)

3 个答案:

答案 0 :(得分:0)

我的建议是始终将您的测验与群组(多对多)联系起来,并将单个玩家视为一组1.因此,您的群组与玩家相关联(也有多对多)

答案 1 :(得分:0)

如果一个人可以属于许多群体,而一个群体可以拥有许多人,那么这是另一个多对多的关系。由于您知道如何创建这些链接表,因此请为此关系创建一个。

答案 2 :(得分:0)

这是一个有趣的设计决定。您的行进方式可以塑造整个应用程序。

我的建议是在每次参与时记录参与者类型。这将是“GROUP”或“PLAYER”,并将定义ParticipantID是指GroupID还是PlayerID。这将最终产生最干净的数据库设计和应用程序逻辑。

所以你的表看起来像:

测验(QuizID,QuizName) QuizParticipation(ParticipationID,ParticipantType,ParticipantID) 组(GroupID,GroupName) GroupMembers(组ID,PlayerID) 播放器(PlayerID,名称)

您可能需要制定自定义约束,以确保无法在QuizParticipation表的ParticipantID和ParticipationType组合字段中创建重复项,或者仔细管理主键的生成。