Database design Web应用中的用户事件订阅
我们正在开发一个Web应用程序,用户可以订阅一组特定的事件。 例如:用户在blob中创建评论,所有订阅此博客的用户的列表中都应该包含此事件 目前,我们正在搜索存储这些数据的数据模型 从可用性的角度来看,将所有事件存储在一个表中似乎是个好主意:Database design Web应用中的用户事件订阅,database-design,events,datamodel,Database Design,Events,Datamodel,我们正在开发一个Web应用程序,用户可以订阅一组特定的事件。 例如:用户在blob中创建评论,所有订阅此博客的用户的列表中都应该包含此事件 目前,我们正在搜索存储这些数据的数据模型 从可用性的角度来看,将所有事件存储在一个表中似乎是个好主意: 对象(在示例中:注释引用) Subscribable对象(在示例中:blog引用) 生成事件的用户 事件类型(如:更新、创建等) 特定用户的订阅事件可以由sql查询收集,sql查询将按用户订阅筛选事件 此数据模型中的问题是,可下标对象可能具有“继承性”
- 对象(在示例中:注释引用)
- Subscribable对象(在示例中:blog引用)
- 生成事件的用户
- 事件类型(如:更新、创建等)
将所有事件放在一个表中或将它们拆分为不同的表是一个好主意吗?无论如何,事件表将有大量的数据。有没有更好的方法来组织事件日志记录 一个表中的子类和单独表中的子类是一个常见问题 没有“好主意”的答案。两者都是好主意 一个问题是您将如何查询它们 如果您很少合并所有不同的事件子类型,并且几乎没有重叠的功能,那么单独的表可能会工作得很好 如果您经常执行一个联合样式的查询,将几个不同的事件子类型组合在一起,或者您有许多重叠的功能,那么单个表可能工作得很好 另一个问题是多态性 如果所有事件子类型都是正确多态的,则应用程序(和数据库)将使用事件子类型的混合集合。这将引导您找到一张桌子 如果您的事件子类型都非常不同,并且不能以多态方式使用,那么它们应该位于单独的表中 后果 当所有子类型都在一个表中时,对于并非所有子类型都通用的属性,必须使用可为空的列。您还应该有一个列,告诉您行代表的子类型 将多个子类型放在一个表中时,必须有一个鉴别器列,告诉行应该是哪个子类型 将子类型放在单独的表中时,有两种设计
- 在所有表中重复公共元素。在几乎没有共同点的情况下这样做
- 让子类型表连接到超类型表,并将公共元素放在一个表中。在几乎所有事情都很普遍的情况下这样做
- 在所有表中重复公共元素。在几乎没有共同点的情况下这样做
- 让子类型表连接到超类型表,并将公共元素放在一个表中。在几乎所有事情都很普遍的情况下这样做
一个表中的子类和单独表中的子类是一个常见问题 没有“好主意”的答案。两者都是好主意 一个问题是您将如何查询它们 如果您很少合并所有不同的事件子类型,并且几乎没有重叠的功能,那么单独的表可能会工作得很好 如果您经常执行一个联合样式的查询,将几个不同的事件子类型组合在一起,或者您有许多重叠的功能,那么单个表可能工作得很好 另一个问题是多态性 如果所有事件子类型都是正确多态的,则应用程序(和数据库)将使用事件子类型的混合集合。这将引导您找到一张桌子 如果您的事件子类型都非常不同,并且不能以多态方式使用,那么它们应该位于单独的表中 后果 当所有子类型都在一个表中时,对于并非所有子类型都通用的属性,必须使用可为空的列。您还应该有一个列,告诉您行代表的子类型 将多个子类型放在一个表中时,必须有一个鉴别器列,告诉行应该是哪个子类型 将子类型放在单独的表中时,有两种设计