MySQL:构建通知消息系统,使其部分内容可以单击

MySQL: Structuring Notification Message System So Parts of It Can Be Clicked

对于我的高级设计项目,我正在开发一个应用程序,工程师可以在其中上传 his/her 3D、2D 或 1D 设计,并获得客户的投票,认为设计看起来不错。我遇到的问题是将我的通知构建为可以单击和详细查看通知部分的位置。如果我想在通知消息之前、之间或末尾插入一个值,如句柄,我是否需要在后端使用带有自定义消息的配置文件,然后从前端插入句柄?请参阅下面的示例 1 和 2。

Example 1 of what the notification should look like:
"Design {design_name} voted by {customer_name} and {50} other customers"

Example 2 of what the notification should look like:
"Your design {design_name} and {10} other designs got votes"

如上例所示,部分内容可点击查看详细内容。在示例 1 中,我应该能够单击 50 并查看为该特定设计投票的剩余客户。相同的概念适用于示例 2。任何建议将不胜感激。谢谢。

//Notifications MySQL Table Fields
+----------+----------+----------+----------+-----------+----------+
|   id     | from_id  |   to_id  |  type    | design_id |  viewed  |
+----------+----------+----------+----------+-----------+----------+
//3D Design MySQL Table Fields
+----------+----------+-------------+-------------+------------+
|design_id | user_id  | description | design_name |   image    |
+----------+----------+-------------+-------------+------------+
//2D Design MySQL Table Fields
+----------+----------+-------------+-------------+------------+
|design_id | user_id  | description | design_name |   image    |
+----------+----------+-------------+-------------+------------+
//1D Design MySQL Table Fields
+----------+----------+-------------+-------------+------------+
|design_id | user_id  | description | design_name |   image    |
+----------+----------+-------------+-------------+------------+

按照table的设计,您可以通过以下方式获取参数。

#notification_1
SELECT 
design_name, 
count(*) - 1 as number_of_other_voters, 
voters_table.voters_name
FROM design_table 
LEFT JOIN votes_table ON voted_design_id = design_id 
LEFT JOIN voters_table on votes_table.voter_id = voters_table.id
WHERE design_id = 'x'
GROUP BY design_id

如果您想将所有内容都塞进一个查询中,那么您可以执行以下操作(尽管我强烈建议不要这样做):

#notification_1 
SELECT CONCAT("Design ", design_name, " voted by ", voters_table.voters_name, " and ", count(*) - 1 as number_of_other_voters,  " other customers")
FROM design_table 
LEFT JOIN votes_table ON voted_design_id = design_id 
LEFT JOIN voters_table on votes_table.voter_id = voters_table.id
WHERE design_id = 'x'
GROUP BY design_id

虽然这会给你一个字符串,而且可能是一个有意义的字符串,但这不会实现你制定的可用性目标。例如,如果您使用 PHP 构建 Web 界面,您只需 运行 第一个查询并将结果分配给一个变量,然后使用填充了一些 ID 的链接构建您的字符串。

foreach($result as $row){
    $notification = "Design " . $row['design_name'] . 
    " voted by <a href='/user/" . $row['customer_id'] . "'>" . $row['customer_name'] . 
    "</a> and <a href='/some_voting_page_url/" . $row['vote_id'] . "'>. " $row['number_of_other_voters'] " . other customers"
}

任何语言(JS、PHP、Java、C 等)都可以使用上述方法将查询中的数据加载到预制字符串中。第二个通知只是计票table(你没有在你的例子中显示投票的存储位置)

SELECT count(*) FROM (SELECT DISTINCT design_id FROM votes_table WHERE user_id = 'x');

这是我目前设计的 table 所能做的最好的事情(考虑到您添加了一个用户 table 和一个投票 table)。正如@Gilbert Le Blank 在对主要任务的评论中指出的那样,您应该只有一个 table 能够标记设计的维度而不是三个设计 table,除非每个存储的数据根本不同。