该设计应该是STI还是单独的型号?

时间:2011-05-24 16:43:12

标签: ruby-on-rails

我有一个应用程序,用户可以上传媒体:歌曲,视频,照片。我在想一个称为媒介的STI。歌曲,视频和照片继承自Medium。

或者我应该将歌曲,视频和照片作为单独的类/模型?

我也有一个评论模型。如果我使用STI方法,那么Comment模型只需要medium_id作为FK。

如果我选择单独的课程,那么我的评论模型必须是多态的。我猜两种方法都有效。但是哪一个应该更多地考虑另一个呢?第二,有什么优势吗?

1 个答案:

答案 0 :(得分:1)

当您有多个要求在捕获的数据,演示文稿的上下文和关系方面有很多重叠时,您可能希望使用STI。你的例子就是其中之一。

我发现当您处理经常聚合并呈现为可互换的多个事物时,STI通常更容易管理。例如,最近上传的“媒体”列表将包含您的所有类型,并可根据需要进行排序或过滤。

在Comment类上建立多态关系也是很常见的,因此可以对任何内容进行评论。唯一的缺点是多态关系在数据库级别上更难加入和验证,所以它们总是会慢一点。

更加数据库友好的方法是使注释充当树或列表,然后让您的媒体模型belong_to成为根,占位符注释,并将实际注释内容传入子项。