【问题标题】:Best schema for a complex relation in a database数据库中复杂关系的最佳模式
【发布时间】:2011-12-23 06:01:02
【问题描述】:

我不是数据库方面的专家,所以这对我来说很复杂,但对很多人来说可能不是。我有以下内容:

quiz: 包含一些测验的表格

project: 包含一些项目的表

project_has_quiz: 多对多关系表项目-测验

team: 包含一些团队的表格

event: 包含一些事件的表(一个项目加上一个日期和一些其他字段)

event_has_team: 多对多关系表事件组

现在,我必须为活动中的每个团队分配测验顺序。例如:

假设您有 5 个测验abcde

您创建了一个项目projectA,其中包含测验abc

您有两个团队:teamAteamB

您使用projectA 创建和事件eventA,并将其与teamAteamB 关联。

现在我必须把eventAteamA 必须有一个测验顺序a, b, ceventAteamB 必须有一个测验顺序c, a, b 放在某个地方。

最好的方法是什么?

我的第一个想法是构建另一个表:event_has_team_has_quizOrder,通过编程代码a, b, cc, a, b 插入一列quizOrder。但我不认为这是实现这一目标的最纯粹的方法,而且这肯定存在非规范化问题。

非常感谢。

【问题讨论】:

    标签: database database-design relational-database database-schema


    【解决方案1】:

    你可以的

    event_has_team_has_quizOrder

    (event, team, quiz, sequence)
    
    
    eventA, teamA, a, 1
    eventA, teamA, b, 2
    eventA, teamA, c, 3
    eventA, teamB, c, 1
    eventA, teamB, a, 2
    eventA, teamB, b, 3
    

    【讨论】:

    • 但是没有更好的办法吗?我的意思是,我希望event_has_team_has_quizOrderquiz 列值由数据库强制在事件相关项目中quiz 列值定义的范围内。在您的回答中,也许是唯一可能的答案,我必须通过编程确保quiz 列永远不会是de。谢谢。
    • 好问题。没有可以让(事件、测验)成为外键的当前表。希望有经验的人能提出建议,您可以不使用检查约束/触发器。
    • 谢谢@chris。我会等待,否则我会将您的答案设置为正确答案。
    • 即使使用检查约束/触发器我也无法得到我想要的,因为我使用的是 MySQL。在 MySQL 中,检查约束被解析,但 they have no effect 并且,至少在 MySQL 中,您不能使用触发器引发错误(这就是我想做的),即使有 hack 但我更喜欢不要使用它,因为我认为这不是一种干净的方式。所以我想我会继续用编程代码来实现约束。
    猜你喜欢
    • 2017-08-04
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多