加强多对多关系

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

enter image description here

我有这种关系,其中菜单至少包含一个菜单项。但是,我在想如果我们创建菜单,菜单中是否有违反该关系的菜单项?我们如何防止菜单项为0的菜单项呢?谢谢

sql postgresql relationship
2个回答
0
投票

没有简单的方法可以做到这一点。一些复杂的方法是:

  • menumenuitem添加一个不可为空的外键,该外键指向与菜单关联的项目之一。

    缺点:每次数据修改都必须保持冗余,最好使用触发器。小心处理死锁。

  • 添加一个触发器,以确保没有数据修改将导致一个孤立的菜单。为了避免出现竞争状况,您必须使用SERIALIZABLE事务,这会导致性能下降。

  • 向每个菜单添加一个计数器,该计数器通过触发器跟踪关联菜单项的数量。像以前的解决方案一样,该方法只能与SERIALIZABLE事务可靠地一起使用。

通常是最好的选择not,出于性能原因,在数据库中强制实施此类约束。毕竟,空菜单绝非灾难。


0
投票

在数据库中强制执行此约束确实具有挑战性。问题:

  • 您不能插入菜单,因为该菜单上没有菜单项(您的新条件)。
  • 您不能插入菜单项,因为菜单不存在(从当前数据模型中显而易见)。>>
  • 相反,在menus上添加一个标志,以提供有关是否有任何菜单项的信息。然后仅选择带有项目的菜单。维护此信息的一种方法是通过触发器。但是,您也可以使用视图:

create view v_menus as 
    select v.*
    from menus m
    where exists (select 1 from menuitems mi where mi.menu_id = m.menu_id);
© www.soinside.com 2019 - 2024. All rights reserved.