通知中存储什么?

时间:2019-06-19 16:49:08

标签: laravel database-design notifications

我目前正在更多地使用Laravels通知包,但是以下问题困扰了我数周:我应该在通知中实际存储什么? 有时通知与特定模型有关,但不总是如此。

示例:您的博客文章已发布。做某事时出错。该条目已删除。

有时这些模型具有诸如Post→Category之类的关系,并且消息应如下所示:您在“ A Category”类别中的博客文章已发布。

现在是问题:

  • 我应该完全保存一个相关模型(例如类别)吗?这将使以后访问它变得更加容易,但这也是造成不一致的原因。还是应该只保存类别ID?仅保存ID意味着我可以引用当前数据,但是如果删除该类别会怎样?这样便无法呈现通知。另外,我还需要每次查询此通知的相关模型。
  • 我应该保存完整的消息还是仅保存数据,然后在客户端上编写消息? (应用程序,SPA Web前端...)。那本地化呢?

什么是将来扩展规模以及将来扩展现有通知的最佳实践?

1 个答案:

答案 0 :(得分:1)

因此,您建议选择: 1.保存包括显示所有必需数据的通知 要么 2.保存仅带有引用的通知,以便以后可以呈现消息

因此,让我们考虑一下这两种选择的优缺点。

选项1:保存包括所有数据

  • 如果删除了相关模型,通知消息仍可以像以前一样呈现(如您所述)
  • 如果相关模型已更改(例如类别标题已更改),则通知消息不会更改
  • 如果您以后想要更改通知以包含相关模型中的其他字段,则这些字段将不可用

选项2:保存仅包括引用

  • 如果删除了相关模型,则无法呈现通知(如您所述)。但是,我认为在这种情况下通知不会有太大意义。
  • 如果相关模型已更改(例如类别标题已更改),则通知消息也会随之更改
  • 如果您以后想要更改通知以包含相关模型中的其他字段,则可以使用这些字段

此外,如果您要在数据库中序列化通知,则以后再更改其模型(例如,删除字段)时,将无法反序列化它们。

选项2的实现

为了采用选项2,实际上无法避免额外的数据库负载。

简便方法

最简单的方法是解决通知中的关系,即在呈现通知数组时查询关系,但这将导致系统对每个关系进行附加查询。

NotificationController.php

$user = App\User::find(1);

foreach ($user->notifications as $notification) {
    echo $notification->type;
}

MyNotification.php

public function toArray($notifiable)
{
    $someRelatedModel = Model::find($this->someRelatedModel_id);
    return [
        'invoice_id' => $this->invoice->id,
        'amount' => $this->invoice->amount,
        'relatedModelData' => $someRelatedModel->data,
    ];
}

更健康的方式

更好的解决方案是调整当前用于检索通知的查询,这样它将包括初始负载上的关系。

NotificationController.php

$notification = App\Notification::byUserId(1)->with('someRelatedModel);

有关更多信息,请参见eager loading

Tl; dr考虑到以上几点,我将选择选项2;仅保留呈现通知时所需模型的引用。