一对多的关系。单个“一个”不是一个实体

时间:2012-07-19 09:52:28

标签: database oop database-design symfony

在我的项目中,我有以下实体: ProjectCategory和Banner

横幅按category_id链接到category。所以一个类别有几个横幅。

问题是除了类别我还有单个(当前是单个)页面,我还需要插入横幅。

Currentl我有几个解决方案:

  1. 从类别取消链接,按代码检查约束,category_id -1表示此cms页面。很好,但没有检查约束。我们需要约束吗?
  2. 从类别中取消链接,创建页面表格。页面可能是类别,因此作为简单页面。附加表,单页将保持单一。
  3. 像is_homepage一样向表添加参数。将横幅附加到随机类别。级联问题可能会发生。
  4. 什么是最好的解决方案?

    P.S。我的工具是symfony2.0和doctrine

1 个答案:

答案 0 :(得分:0)

可能最简单的解决方案是在横幅中同时具有category_id(NULL-able 1 FK朝向Category)和page_id(对于Page为NULL的FK)。您可以允许或限制(通过CHECK)同一横幅属于类别和页面的可能性。

要在每页强制执行(最多)单个横幅广告,请使page_id成为备用密钥(UNIQUE约束)。

综上所述,您的模型将如下所示:

enter image description here

CHECK (
    (CATEGORY_ID IS NOT NULL AND PAGE_ID IS NULL)
    OR (CATEGORY_ID IS NULL AND PAGE_ID IS NOT NULL)
)

1 在检查外键违规时,DBMS会跳过NULL。