在按实体使用不同的列时,我应该使用多态关系吗?

时间:2017-10-25 15:52:43

标签: laravel laravel-5 database-design polymorphism relational-database

我有一些表格,我不确定使用多态关系是否有意义,因为在其中一个表格中有不同的列/属性。
(注:我在laravel 5.5建造)

以下是表格的简化版本:

pick_up_points, shipping_entities, products
  id
  name

pick_up_points_periods
  id
  pick_up_point_id
  week_day // -> a number matching the day of the week (0->Monday, ..., 6->Sunday)
  start_time // ex: "24:59"
  end_time

shipping_entities_delivery_periods  // (the shipping entities follow the same delivery pattern between them)
  id
  shipping_entity_id
  week_day
  start_time
  end_time

product_promotion_periods
  id
  product_id
  start_date // ex: "2017-10-25"
  end_date

我在想两种可能的方式来使用多态关系。

案例1 - 创建表格时段只是为了替换表pick_up_points_periods和shipping_entities_delivery_periods

periods
  id
  periodable_type
  week_day
  start_time
  end_time

在这种情况下(1)它对我来说更有意义,因为它们使用相同的字段/列,但它会留下另一个句号表。

案例2 - 创建表格句点以替换所有* _periods表格(表格pick_up_points_periods,shipping_entities_delivery_periods和product_promotion_periods)

periods
  id
  periodable_id
  periodable_type
  week_day
  start_time
  end_time
  start_date
  end_date

在这种情况下(2)对我来说没什么意义,因为它们使用不同的字段/列,但它会将所有周期上下文表放在一起(通过减少更多的表数)。   。如果是pick_up_points_periods或product_promotion_periods,则会有未使用列的记录。

我的思路:

在laravel v5.5文档here中,有两个多态关系示例:

  • 评论 - 帖子和视频都存在
  • 标签 - 适用于帖子和视频

对我来说,评论和标签都是有意义的多态实体,因为它们在其他实体(帖子,视频或其他任何我想到的想法)上总是有相同的共享字段。

然而,在某些时期我可以想到它们的种类很多,例如:

  • 一周中某一天的时间段
  • 时间段(每天)
  • 日期([start_date:' 2017-02-28',end_date:' 2017-05-31'])
  • 时间戳期间(例如:[start_date:' 2017-02-28 08:00:00',end_date:' 2017-05-31 20:00:00'])
  • 每月的几周(例如:仅在每个月的前2周)
  • 一个月中的某一天(例如:仅在每个月的第3个星期二)
  • 他们的混合([开始/结束] _ [时间/日期/时间戳],周日,月_ [日/周]),...

其中每个实体/表可以具有不同的属性/列,即使它们仍然适合"期间"上下文。

  • 我可以构建一个包含所有字段的多态表(如情况2),但它们可能为空/ null,具体取决于periodable_type
    • 但至少还可以预测周期模式的变化(/使用的字段)
      • 或仅在需要时添加新字段,即使并非所有类型都使用

我试图搜索类似的东西,如果有关于何时使用或不使用多态关系"的最佳实践,但我无法正确找到类似的情况。

所以我想知道:是否应该使用案例1,案例2或者根本不使用多态关系?每个人的利弊是什么?这件事有什么最好的做法吗?

提前谢谢。

0 个答案:

没有答案