一千萬個為什麽

搜索

如果不支持復合鍵,如何處理視圖中的id和多態關聯?

我有一個電影計劃表:

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中的進程中不再持久)

關於如何處理這種情況的任何想法?

最佳答案

我認為你的模型有點過於復雜。 MoviePlan是一種用於每天電影時間表的模式嗎?我非常建議刪除MovieSchedule,而是允許用戶復制現有的MoviePlan。這將a)使您的設計更簡單,並且b)為用戶提供更多自由,因為時間表通常在現實中不同。星期六是一個額外的日場,周三特別的外國電影,這就是我在我最喜歡的電影院看到的。

最後,對特定電影計劃和時間表的電影發表評論對我來說沒有任何意義,或者這是一些客戶管理的事情,比如“我的座位在7點的搞笑電影節目中是不是很臟”?

轉載註明原文: 如果不支持復合鍵,如何處理視圖中的id和多態關聯?