Database design 动态通知系统-除了我,其他人觉得这很奇怪吗?

Database design 动态通知系统-除了我,其他人觉得这很奇怪吗?,database-design,notifications,normalization,Database Design,Notifications,Normalization,我有一个通知系统的结构,我相信它是相当动态的,尽管我担心我的解决方案可能会打破数据库设计的一些基本规则 通知 id notification_type_id data created_at user_id notification_id is_read 用户通知 id notification_type_id data created_at user_id notification_id is_read 我质疑的部分是notifications表中的数据列,它保存构建消息所需的相关数据(

我有一个通知系统的结构,我相信它是相当动态的,尽管我担心我的解决方案可能会打破数据库设计的一些基本规则

通知

id
notification_type_id
data
created_at
user_id
notification_id
is_read
用户通知

id
notification_type_id
data
created_at
user_id
notification_id
is_read
我质疑的部分是notifications表中的数据列,它保存构建消息所需的相关数据(json格式)。例如,如果通知是针对在帖子上添加的新评论,那么数据将包含帖子的id以及对帖子发表评论以生成必要消息的用户的id

示例:
{post\u id:123,user\u id:456}
将生成一条消息“Dumbo回答了您的问题……要花多少钱?”


让一列保存对其他记录的多个引用的想法让我大错特错,但它看起来确实是一个非常动态的选择。如果不是这样的话,我唯一能想到的另一个选择是先生成消息,然后将其存储在数据库中,这对我来说太静态了,因为所有参与的人都会收到相同的消息。

是的,如果需要一个规范化的数据库,这看起来很奇怪。如果实体
A
与实体
B
存在依赖关系,则必须在
A
中输入外键。两个依赖项-相同数量的键

我在不同的结构中看到了您案例中的问题,
通知
实体取决于一些
通知类型
。这意味着您在数据库中获得了继承。有一些策略允许您为自己的需求创建适当的体系结构。试着比较一下


希望我正确理解了这个问题。

关系模型允许任意复杂类型。但是如果一个复杂类型有一些内部结构,那么

  • dbms忽略它,或者
  • dbms(不是用户)提供了操作它的函数
例如,日期具有内部结构。数据库管理系统提供了通过截断、提取部分、添加和减去间隔等操作该结构的功能

JSON也有内部结构。如果您的DBMS支持JSON数据类型,它将提供操作该数据类型的函数。如果没有,它将忽略它是JSON类型的事实,并将存储的JSON数据返回给用户

到目前为止,没有问题

但是,话虽如此

示例:{post_id:123,user_id:456}将生成消息“Dumbo” 回答了你的问题……要花多少钱?”

这里的一个问题是dbms不能保证用户id 456的存在,因此调用者不知道从id号到名称的转换是否有效。它也无法知道post ID 123是否仍然存在。这些类型的约束就是外键的作用,您不能对存储为JSON的id号强制外键约束

您的主要风险是向来电者返回无意义(或空值)。在某些情况下,这是完全可以辩护的。(比如说博客。谁真的在乎你偶尔收到一条毫无意义的信息呢?)在其他情况下,这可能是灾难性的

相反,如果您存储文本“Dumbo回答了您的问题,‘多少…’”,则不会因为删除了用户或帖子而失败。即使帖子和用户都被删除,消息“Dumbo回答了你的问题,‘多少…’”仍然是一个真实的事实。(尽管可能不太有用,这取决于系统处理删除的方式。)