如果不支持复合键,如何处理视图中的id和多态关联?

时间:2010-05-08 14:34:48

标签: ruby-on-rails database-design activerecord

我有一张电影计划表:

movie_plans (id, description)

每个计划都有项目,描述一系列电影和持续时间(分钟):

movie_plan_items (id, movie_plan_id, movie_id, start_minutes, end_minutes)

该计划的具体实例发生在:

movie_schedules (id, movie_plan_id, start_at)

但是,可以通过添加分钟来从movie_plan_items和计划开始时间计算计划项目

create view movie_schedule_items as
 select CONCAT(p.id, '-', s.id) as id,
   s.id as movie_schedule_id,
   p.id as movie_plan_item_id,
   p.movie_id, p.movie_plan_id,
   (s.start_at + INTERVAL p.start_minutes MINUTE) as start_at,
   (s.start_at + INTERVAL p.end_minutes MINUTE) as end_at
 from movie_plan_items p, movie_schedules s
 where s.movie_plan_id=p.movie_plan_id;

我在这个视图上有一个模型(readonly),它工作正常,除了id现在是一个字符串。

我现在想要为以前的各种表添加多态属性(如注释)。因此,对于movie_schedule_items,我需要一个唯一且持久的数字ID。

我有以下两难困境:

  • 我可以避免使用id并让movie_schedule_items只使用movie_plan_id和movie_schedule_id作为复合键。但Rails在这方面很糟糕。
  • 我可以使用String #hash或md5创建一个id,从而使其更慢或容易发生冲突(并且IIRC String #hash在Ruby 1.9中的进程中不再持久)

关于如何处理这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

我认为你的模型有点过于复杂。 MoviePlan是一种用于每天电影时间表的模式吗?我非常建议删除MovieSchedule,而是允许用户复制现有的MoviePlan。这将a)使您的设计更简单,并且b)为用户提供更多自由,因为时间表通常在现实中不同。星期六是一个额外的日场,周三特别的外国电影,这就是我在我最喜欢的电影院看到的。

最后,对特定电影计划和时间表的电影发表评论对我来说没有任何意义,或者这是一些客户管理的事情,比如“我在7点的搞笑电影节目中的座位是否脏”?