如何构建这些关系?

时间:2012-05-31 14:35:10

标签: mysql sql

我有一个表tablet,其中包含period_id列。 tablet表与period表具有多对一关系,period表与sub_period表具有一对多关系。我需要能够在sub_period中指定单个tablet条目,其选择受period条目的限制,但由于sub_period仅取决于{ {1}},我不能。我该如何塑造这个?

在我的模型中,每个period行应该有一个tablet条目和一个period条目。 sub_periodperiod之间的关系应为sub_period(一个时段可能有多个子时段,但每个子时段只能属于一个时段)。 1:n我希望能够在sub-period中选择的tablet应该受到period

的选择限制

编辑:已经意识到我需要tabletperiod之间的N:1关系:许多平板电脑可能与同一时期有关。

3 个答案:

答案 0 :(得分:2)

has_tablet ENUM('1')中创建可为空的列sub_period,并在UNIQUE上创建sub_period (period, has_tablet)约束。

has_tablet只能接受值1NULL,这意味着您可以将每个时段的一个季节恰好设置为“拥有平板电脑”。由于periodtablet是一对一的,因此这也唯一地标识了tablet

使用此解决方案可能无法在任何时间段内设置任何平板电脑。如果这是一个问题,请将period添加到tablet并使tablet (period, sub_period)引用sub_period (period, sub_period)

这是非规范化但它永远不会导致不一致(因为period在两个表中都由sub_period定义。)

<强>更新

似乎平板电脑的时期是一对多的。在这种情况下,只需添加make tablet引用sub_period而不是periodperiod关系可以通过简单的连接传递推断。

答案 1 :(得分:0)

然后你有两个选择:

  • 数据库层:通过触发器实现一致性约束。插入或更新后,如果sub_pediod不是平板电脑周期的子周期,则引发相应的错误。
  • 应用层:只在必要时,实施适当的GUI以提供正确的选择。

第二个选项是我最喜欢的,只要它是关于非敏感数据(请记住有人总是可以跳过客户端界面),因为它通常会给我更多“运动范围”以及我想要处理问题的方式。当然总有例外......

答案 2 :(得分:0)

当你为你建模时,通常你不会创建1:1关系,当你规范化时你会注意到关系1:1的表你可以将它们匹配到一个表中,这就是我看到它的方式: 如果你有3个关系表

  • 平板电脑 1:n sub_period
  • 平板电脑 1:1 期间

(图中的键是原色键,红色符号是外键)

enter image description here

或者您可以在平板电脑期间表格之间进行匹配,模型将如下所示

enter image description here

平板电脑吸收期间及其所有属性,但这取决于您,您必须根据自己的需要调整模型。