多表与表记录需要彼此

问题描述 投票:2回答:2

我有两张桌子:会谈和日子。会谈看起来像:

+----+----------------------------------+--------+
| Id |               Name               | Leader |
+----+----------------------------------+--------+
|  1 | How to improve revenue for tacos | Tacob  |
|  2 | Improving sales potential        | Bocat  |
+----+----------------------------------+--------+

和天:

+--------+-----+
| TalkId | Day |
+--------+-----+
|      1 | Mon |
|      1 | Tue |
|      1 | Thu |
|      2 | Mon |
|      2 | Tue |
+--------+-----+

TalkId是引用Talks表的外键。

外键强制执行“一天需要谈话”的关系。但是,我还想强制执行“A Talk至少需要一天”的反向关系。

我知道这个约束类似于多对多关系,两个记录都相互依赖。然而,在这种情况下,很多天参考一个谈话,但只有一个谈话参考了许多天。

另一个问题是,在创建这样的约束之后,如何一次插入两个记录?

我已经搜索了其他问题,只找到了多对多关系的案例,结果如下:

+----+----------------------------------+--------+
| Id |               Name               | Leader |
+----+----------------------------------+--------+
|  1 | How to improve revenue for tacos | Tacob  |
|  2 | Improving sales potential        | Bocat  |
+----+----------------------------------+--------+

+----+-----+
| Id | Day |
+----+-----+
|  1 | Mon |
|  2 | Tue |
|  3 | Thu |
|  4 | Mon |
|  5 | Tue |
+----+-----+

+--------+-------+
| TalkId | DayId |
+--------+-------+
|      1 |     1 |
|      1 |     2 |
|      1 |     3 |
|      2 |     4 |
|      2 |     5 |
+--------+-------+

TalkId引用TalksIdDayId引用DaysId

编辑:

忽略我上面要求的内容。

我希望能够做到:

  1. SELECT所有有效的Talks
  2. SELECT所有有效的Days

我希望无法做到的事情:

  1. INSERT没有TalkDay
  2. INSERT没有DayTalk
sql database database-design
2个回答
0
投票

听起来你想要一个简单的外键关系:

alter table days add constraint fk_days_talkid foreign key (talkid) references talks(talkid);

这保证了talkid有效。然后你宣布days.talkidnot null,你保证你描述的关系。


0
投票
-- Day named (TheDay) exists.
--
Calendar {TheDay}
      PK {TheDay}


-- Talk (TalkID) titled (TalkName), presented by (Leader) is by default
-- scheduled on (DefaultDay).

Talk {TalkID, TalkName, Leader, DefaultDay}
  PK {TalkID}
  AK {TalkName}

FOREIGN KEY {DefaultDay} REFERENCES Calendar {TheDay}


--Talk (TalkID) is also scheduled on (TheDay).
--
TalkDay {TalkID, TheDay}
     PK {TalkID, TheDay}

FOREIGN KEY {TalkID} REFERENCES Talk     {TalkID}
FOREIGN KEY {TheDay} REFERENCES Calendar {TheDay}
Note PK = primary key
     AK = alternate key (unique)
     All attributes (columns) NOT NULL

选择特定谈话的所有日期:

select TalkName, DefaultDay as TalkDay
from Talk
where TalkName = 'How to improve revenue for tacos'

union

select TalkName, b.TheDay as TalkDay
from Talk    as a
join TalkDay as b on b.TalkID = a.TalkID
where a.TalkName = 'How to improve revenue for tacos'

选择特定日期的所有会谈:

select TalkName, DefaultDay as TalkDay
from Talk
where DefaultDay = 'Tue'

union

select TalkName, b.TheDay as TalkDay
from Talk    as a
join TalkDay as b on b.TalkID = a.TalkID
where b.TheDay = 'Tue'
© www.soinside.com 2019 - 2024. All rights reserved.