Database design Web应用中的用户事件订阅

Database design Web应用中的用户事件订阅,database-design,events,datamodel,Database Design,Events,Datamodel,我们正在开发一个Web应用程序,用户可以订阅一组特定的事件。 例如:用户在blob中创建评论,所有订阅此博客的用户的列表中都应该包含此事件 目前,我们正在搜索存储这些数据的数据模型 从可用性的角度来看,将所有事件存储在一个表中似乎是个好主意: 对象(在示例中:注释引用) Subscribable对象(在示例中:blog引用) 生成事件的用户 事件类型(如:更新、创建等) 特定用户的订阅事件可以由sql查询收集,sql查询将按用户订阅筛选事件 此数据模型中的问题是,可下标对象可能具有“继承性”

我们正在开发一个Web应用程序,用户可以订阅一组特定的事件。 例如:用户在blob中创建评论,所有订阅此博客的用户的列表中都应该包含此事件

目前,我们正在搜索存储这些数据的数据模型

从可用性的角度来看,将所有事件存储在一个表中似乎是个好主意:

  • 对象(在示例中:注释引用)
  • Subscribable对象(在示例中:blog引用)
  • 生成事件的用户
  • 事件类型(如:更新、创建等)
特定用户的订阅事件可以由sql查询收集,sql查询将按用户订阅筛选事件

此数据模型中的问题是,可下标对象可能具有“继承性”。例如:用户可能订阅了博客或博客中的特定帖子。 这意味着Blog订阅扩展了post订阅,而这个数据模型并不反映这种行为。在这种情况下,我必须生成两个事件:一个用于blog,一个用于post


将所有事件放在一个表中或将它们拆分为不同的表是一个好主意吗?无论如何,事件表将有大量的数据。有没有更好的方法来组织事件日志记录

一个表中的子类和单独表中的子类是一个常见问题

没有“好主意”的答案。两者都是好主意

一个问题是您将如何查询它们

如果您很少合并所有不同的事件子类型,并且几乎没有重叠的功能,那么单独的表可能会工作得很好

如果您经常执行一个联合样式的查询,将几个不同的事件子类型组合在一起,或者您有许多重叠的功能,那么单个表可能工作得很好

另一个问题是多态性

如果所有事件子类型都是正确多态的,则应用程序(和数据库)将使用事件子类型的混合集合。这将引导您找到一张桌子

如果您的事件子类型都非常不同,并且不能以多态方式使用,那么它们应该位于单独的表中

后果

当所有子类型都在一个表中时,对于并非所有子类型都通用的属性,必须使用可为空的列。您还应该有一个列,告诉您行代表的子类型

将多个子类型放在一个表中时,必须有一个鉴别器列,告诉行应该是哪个子类型

将子类型放在单独的表中时,有两种设计

  • 在所有表中重复公共元素。在几乎没有共同点的情况下这样做

  • 让子类型表连接到超类型表,并将公共元素放在一个表中。在几乎所有事情都很普遍的情况下这样做


  • 一个表中的子类和单独表中的子类是一个常见问题

    没有“好主意”的答案。两者都是好主意

    一个问题是您将如何查询它们

    如果您很少合并所有不同的事件子类型,并且几乎没有重叠的功能,那么单独的表可能会工作得很好

    如果您经常执行一个联合样式的查询,将几个不同的事件子类型组合在一起,或者您有许多重叠的功能,那么单个表可能工作得很好

    另一个问题是多态性

    如果所有事件子类型都是正确多态的,则应用程序(和数据库)将使用事件子类型的混合集合。这将引导您找到一张桌子

    如果您的事件子类型都非常不同,并且不能以多态方式使用,那么它们应该位于单独的表中

    后果

    当所有子类型都在一个表中时,对于并非所有子类型都通用的属性,必须使用可为空的列。您还应该有一个列,告诉您行代表的子类型

    将多个子类型放在一个表中时,必须有一个鉴别器列,告诉行应该是哪个子类型

    将子类型放在单独的表中时,有两种设计

    • 在所有表中重复公共元素。在几乎没有共同点的情况下这样做

    • 让子类型表连接到超类型表,并将公共元素放在一个表中。在几乎所有事情都很普遍的情况下这样做


    我知道以下功能。以下操作将导致生成事件的用户对事件进行分组。这意味着所有事件对象类型的联合。这似乎是存储在一个表中的最终原因。以下操作将导致生成事件的用户对事件进行分组。这意味着所有事件对象类型的联合。似乎这是一个最终的原因,存储在一个表。