2012-05-31 28 views
0

我有一个表tablet,列period_idtablet表与表period有多对一的关系,period表与表sub_period有一对多的关系。我需要能够在tablet中指定单个sub_period条目,其中的选择受period条目限制,但由于sub_period仅取决于period,所以我不能。我应该如何建模?如何构建这些关系?

在我的模型中,每个tablet行应该有一个period条目和一个sub_period条目。 periodsub_period之间的关系应该是1:n(一个时期可能有许多子时期,但每个子时期只能属于一个时期)。该sub-period的I希望能够从tablet选择应该由我选择的period

编辑限制:已经意识到我需要一个N:tabletperiod之间一对一的关系:很多片可以涉及同期。

+0

问题是什么应该是这个子期到你的平板电脑表入口? Functionnaly – Sebas

+0

'sub_period'如何记录与'period'的关系?当然它也有'period_id'列?在这种情况下,你能不能直接[join](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html)'tablet'到'sub_period那个专栏? – eggyal

+0

@sebas它将是来自sub_period的记录子集之一,具体取决于所选的周期。假设有两个周期:A和B.周期A具有子周期sp_A_1和sp_A_2,周期B具有子周期sp_A_3和sp_A_4。如果我的平板电脑条目链接到期间A,则应该只能在sp_A_1和sp_A_2之间进行选择。 – urschrei

回答

0

然后你有2种选择:

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

第二个选项是我最喜欢的,只要它是关于非敏感数据(记住别人总是可以跳过客户端界面),因为它通常给了我更多的与我要如何应对“运动范围”问题。当然总有例外......

0

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

  • 平板 1:N sub_period
  • 平板 1:1

(图形中的键是初选键和红色的符号是外键)

enter image description here

,或者你可以让平板表和之间的匹配模型看起来像这样

enter image description here

其中平板吸收时间段具有他的所有属性,但这取决于你,这个模型你必须适应你的需求。

2

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

has_tablet只能接受价值1NULL,这意味着你可以设置每个周期只有一个赛季“具有平板电脑”。由于periodtablet是一对一的,因此也唯一标识tablet

根据此解决方案,可以不设置任何片剂一段时间。如果是问题,请将period添加到tablet,并使tablet (period, sub_period)参考sub_period (period, sub_period)

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

更新:

似乎期间平板电脑是一个一对多的。在这种情况下,只需添加make tablet参考sub_period而不是periodperiod关系可以通过简单的连接进行传递。

+0

这里的问题是,几个平板电脑可能会在一个给定的时间段内与同一个子时间段相关联,所以您的“每个时段一个季节”限制太多。因此,我需要的唯一限制是你不应该能够选择一个不属于你选择的期间“多”一部分的子时期。 – urschrei

+0

@urschrei:但是......你说这是'tablet'和'period'之间的一对一关系。如果许多平板电脑引用相同的子时间段,则它们也必须引用同一时间段,这与1对1平板电脑/时间段的关系相矛盾。我错过了什么? –

+0

@AndriyM这是我感到困惑的地方。每行只能有一个单独的期间条目和一个单独的子期间条目。但是这个解决方案意味着如果我将平板电脑记录连接到一个子时间段,我就无法将任何其他平板电脑连接到该子时间段。除非我误解。 – urschrei