主表和子表之间的数据库表循环引用

时间:2016-04-02 12:53:20

标签: database database-design

我有两张桌子

  • person_photos

与一对多的关系(即每个人都可以有照片列表)

e.g。

person {
    person_id number, <<THIS IS PK>>
    person_name varchar,
    other_columns...
}


person_photos {
    person_photo_id number,<<THIS IS PK>>
    person_id number, <<THIS IS FK>>
    photo blob
}

我想将其中一张照片标记为默认照片。可以参考主表中的默认照片

person {
    person_id number,<<THIS IS PK>>
    person_name varchar,
    other_columns...
    default_person_photo_id number <<Reference to child table>>
}

这基本上创建了两个表之间的循环引用。

这种方法有什么问题吗? 或者其他更好的方式吗?

注意:

  • 我可以在person_photo表中引入一列来标记哪一个是默认值但是我主要在主表中引入此默认照片ID以避免通过加入照片表来获取该信息

  • 我也可以创建一个映射表,但是只有在有任何问题的循环设计时我才会采用这种方法

1 个答案:

答案 0 :(得分:0)

部分原因取决于您使用的RDBMS。如果您使用的是没有部分唯一索引(例如MySQL),那么这可能是您可以做到的最佳方式。

另一方面,如果您可以拥有部分唯一索引,那么您可以执行以下操作:

  1. 删除person.default_person_photo_id
  2. 添加布尔person_photos.is_default fild
  3. CREATE UNIQUE INDEX default_person_photos_idx ON person_photos(person_id) WHERE is_default
  4. 然后你永远不会有多个,如果你根据person_id where is_default搜索照片,那么可以使用索引,可能会为你节省一个连接。

    因此,在不知道您的rdbms功能的情况下回答您的问题时,我不能说您有更好的方法,而且您当然没有做错任何事情。但对于一些RDBMS,有一种更好的方法。

相关问题