2016-04-02 48 views
0

我有两个表数据库表循环引用

  • person_photos

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

eg

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,以避免由joinin照片表

  • 获得该信息
  • 我还可以创建一个映射表,但我想一起去该方法仅如果有任何问题圆形设计

回答

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

然后你不能超过一个,如果您根据person_id where is_default搜索照片,则可以使用该索引,可能为您节省加入。

因此,在不知道rdbms功能的情况下回答你的问题,我不能说你有更好的办法,而且你肯定没有做错任何事情。但对于一些RDBMS来说,还有更好的方法。

+0

谢谢克里斯!我正在使用MariaDB – ybn

+0

在这种情况下,您的方法可能是您可以做的最好的方法。 –