【问题标题】:Add multiple constraints in same column在同一列中添加多个约束
【发布时间】:2020-06-17 12:51:49
【问题描述】:

我的表有下表:

  1. 团队
  2. 联赛
  3. 玩家
  4. 教练
  5. 关键词

现在,在关键字表中,有几列:id、topic_id、topic_type。

对于球队、联赛、球员和教练,他们有多个关键字(与关键字的一对多关系)。例如:如果团队表中有 id 为 4 的团队 ABC;在关键字表中,将有 id, 4, team。如果玩家表中有id为3的玩家CDE;在keywords表中,会有id、3、player等。

所以,在这里我要做的是在关键字中添加一个约束,当从任何 topic_type 中删除主题时,我可以删除该关键字。 我该怎么做? 我们可以通过阅读一些答案的 Schema ondelete Cascade 轻松做到这一点,但在我的情况下,应该有一个限制,但来自多个来源。

如何对所有球队、联赛、球员和教练的关键字表设置限制条件?

谢谢

【问题讨论】:

  • 数据库有表。表有列。见meta.stackoverflow.com/questions/333952/…
  • 让一个字段可能引用多个表是一种糟糕的设计。最好的办法就是为每个“父”表的关键字创建一个单独的“子”表。
  • 是的,我同意@Uueerdo 你必须先规范化你的数据库。使用糟糕的设计会导致许多后果。

标签: php mysql sql database laravel


【解决方案1】:

我认为在 MySQL 中使用约束是无法做到的。

另一种选择是修改您的数据库结构。您可以使用单独的表格来存储每个实体(球队、联赛、球员、教练)和关键字之间的关系。

因此,您将创建四个附加的桥接表:

teams_keywords  (team_id,    keyword_id)
league_keywords (league_id,  keyword_id)
players_keywords(player_id,  keyword_id)
coaches_keywords(coaches_id, keyword_id)

每个表都有与实体表相关的外键,以及链接keyword 表的外键。您可以在这些外键上使用选项 on delete cascade 来执行您想要的逻辑。

请注意,这种结构也可能会简化您的某些查询。假设您想获取与给定关键字匹配的所有teams,然后:

select t.*
from teams t
inner join team_keywords tk on tk.team_id = t.team_id
inner join keywords k on k.keyword_id = tk.keyword_id
where k.name = 'foo'

【讨论】:

  • OP 不打算共享关键字,因此这种设计实际上可以防止删除团队时级联到该团队的关键字。
  • @Uueerdo: 可能是,是的,OP 不想分享(尽管我希望称为 keywords 的东西是为此而生的)。在这种情况下,我们不需要keywords 表,只需为每个实体创建一个单独的子表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
相关资源
最近更新 更多