我的laravel应用程序有一些services and products
,为了简单起见,我将尽可能保持通用,我打算将单个服务/产品称为resource
。
我必须以这种方式实现消息传递系统,以便客户端可以针对单个resource
向管理员发送消息(反之亦然)。
例如,将project
视为一种此类资源。管理员可以创建project
,客户端可以向创建该项目的管理员发送消息。客户端无法创建project
。
这就是我设计db模式的方法:
对话(id,message_id,from,to,body,is_seen)
消息(id,resource_id,resource_name)
项目(id,admin_id,client_id,some_other_column)
another_resource(id,admin_id,client_id,some_other_column)
yet_another_resource(id,admin_id,client_id,some_other_column)
注意resource_id
表中的resource_name
和messages
:
resource_id 是其中一个资源表(projects,another_resource,yet_another_resource)的id。
resource_name 是我的问题所在。如果我实现此模式,我将不得不在此列中硬编码表名。消息表中的条目如下所示:
+----+---------------+-------------+---------------------+---------------------+
| id | resource_name | resource_id | created_at | updated_at |
+----+---------------+-------------+---------------------+---------------------+
| 1 | project | 1 | 2018-01-13 15:11:07 | 2018-01-13 15:11:07 |
+----+---------------+-------------+---------------------+---------------------+
正如您所看到的,如果某个客户端必须在another_resource
条目上发送消息,我必须在消息表中将字符串"another_resource"
存储为 resource_name 以及 resource_id
id
行的another_resource
我承认我不是一名优秀的数据库设计师,但我强烈认为将表名存储为列值并不是一个好主意。必须有一些动态的处理方式。我怎样才能改进我的架构?任何修改,建议或建议将不胜感激。