我认为这里没有人解决这样一个事实,即通知通常会再次发生,也就是。即将发生的交易的通知总是相同的,但其中包含不同的交易 ID 或日期。因此:{您有一笔新的即将付款:@paymentID,到期日为@dueDate}。
将文本放在不同的表格中也可以帮助
- 如果您想稍后更改通知文本
- 使应用程序多语言化更容易,因为我可以只使用语言代码对通知表进行分层并检索适当的字符串
因此我还为那些抽象通知制作了一个表格,它们只是在用户下方与一个中间表格链接,其中一种通知类型可以多次发送给一个用户。我还不是通过外键 ID 将通知链接到用户,但我为所有通知制作了通知代码,并且全文索引了这些代码的 varchar 字段,以加快阅读速度。由于这些通知需要在特定的时间发送,开发者也更容易编写
NotificationService::sendNew( Notification::NOTE_NEW_PAYMENT, ['paymentId'] => 123, ['dueDate'] => Carbon::now(), 'userIdToSendTo' );
现在,由于我的消息中将包含自定义数据,即插入到字符串中,正如您事先从第二个参数中看到的那样,我会将它们存储在数据库 blob 中。像这样
$values = base64_encode(serialize($valuesInTextArray));
这是因为我想将通知与其他表分离,因此我不想在通知表之间创建不必要的 FK 关系,因此我可以说通知 234 附加到事务 23 然后加入并获取该交易 ID。解耦这消除了管理这些关系的开销。缺点是,删除通知几乎是不可能的,例如删除事务时,但在我的用例中,我决定无论如何都不需要这样做。
我将在 App 端检索并填写文本如下。附言。我正在使用某人的 vksprintf 函数 (https://github.com/washingtonpost/datawrapper/blob/master/lib/utils/vksprintf.php),支持他!
$valuesToFillInString = unserialize(base64_decode($notification->values));
vksprintf( $notificationText->text, $valuesToFillInString )
还要注意我索引了哪些字段,因为我将按它们查找或排序
我的数据库设计如下
================================
表格:用户
================================
表格:通知
- id (pk)
- user_id (fk, indexed)
- text_id(fk - NotificationTexts 表)
- values (blob) [包含值数组,输入到文本字符串]
- createdDateTime(日期时间)
- 读取(布尔值)
[ClusterIndex] => (user_id, createdDateTime)
================================
表格:通知文本
- id (pk)
- text_id(唯一索引)
- text (varchar) [{ 您有一笔新的即将付款:@paymentID,到期日为@dueDate }]
- note(varchar,可为空)[开发人员说明,信息栏]