Database design 用于识别一对多关系的前1个子项的模型

Database design 用于识别一对多关系的前1个子项的模型,database-design,Database Design,有没有优雅的DB模型设计模式可以用来识别一对多关系中最近的孩子 给定一个普通的父/子模型,您可以通过TSQL实现。然而,我想找到一种高效的方法,它不需要查看许多行或索引顺序 此示例设计将最新的子ID存储在父项中。这似乎是一个糟糕的设计,因为您可能会有更新“顶级子ID”的争用 父表 -父ID -顶级儿童ID 子表 -儿童ID -父ID 有人有聪明或优雅的解决方案吗?这个问题基本上有两个方面。第一,“最近的孩子”事实的来源: A:事实是根据某个数据库属性确定的(“最新修改的时间戳=最新) B:事实根

有没有优雅的DB模型设计模式可以用来识别一对多关系中最近的孩子

给定一个普通的父/子模型,您可以通过TSQL实现。然而,我想找到一种高效的方法,它不需要查看许多行或索引顺序

此示例设计将最新的子ID存储在父项中。这似乎是一个糟糕的设计,因为您可能会有更新“顶级子ID”的争用

父表 -父ID

-顶级儿童ID

子表 -儿童ID

-父ID


有人有聪明或优雅的解决方案吗?

这个问题基本上有两个方面。第一,“最近的孩子”事实的来源:

A:事实是根据某个数据库属性确定的(“最新修改的时间戳=最新)

B:事实根据涉及子项的事件确定(“最后一次显示在页面上=最近一次)

第二,随时间推移检索此事实的方式:

C:事实作为属性存储并通过查询检索

D:事实是动态计算的

这样分解会暴露出一些(可能不明显的)情况:

1) B不会在会话间持久化。如果你试图坚持B,那么你已经把它变成了A。另一方面,B类型的解决方案适合于内存缓存技术。如果你不介意“最近一个孩子”的事实是暂时的,这可能是一条路要走。在内存中存储最新的

2) 如果你需要这一事实持续下去,你就会陷入A。某种程度的争用是不可避免的,因为您正在使用快速变化的值更新数据库结构

3) 使用A后,您必须在CD之间进行选择。此选项应由预期的读写比决定。如果您的应用程序阅读量很大(子应用程序每小时更改一次,最近性检查为10倍/秒),则计算一次并存储在父表中。如果您的应用程序写得很重(儿童每秒钟更改10次,每小时检查一次最近性),则动态计算,即仅当您需要知道“最近性”时

请注意,由于可以动态确定“最近的子项”,因此将其存储在父表中是多余的。由于非规范化通常只在性能上有很大的提高,除非您阅读量很大,否则我会动态计算。您可以随时在以后重构


我不知道这是否能为您提供一个优雅的解决方案,但它会为您的情况提供“正确”的解决方案,这可以说是一个不错的替代方案。

这个问题基本上有两个方面。第一,“最近的孩子”事实的来源:

A:事实是根据某个数据库属性确定的(“最新修改的时间戳=最新)

B:事实根据涉及子项的事件确定(“最后一次显示在页面上=最近一次)

第二,随时间推移检索此事实的方式:

C:事实作为属性存储并通过查询检索

D:事实是动态计算的

这样分解会暴露出一些(可能不明显的)情况:

1) B不会在会话间持久化。如果你试图坚持B,那么你已经把它变成了A。另一方面,B类型的解决方案适合于内存缓存技术。如果你不介意“最近一个孩子”的事实是暂时的,这可能是一条路要走。在内存中存储最新的

2) 如果你需要这一事实持续下去,你就会陷入A。某种程度的争用是不可避免的,因为您正在使用快速变化的值更新数据库结构

3) 使用A后,您必须在CD之间进行选择。此选项应由预期的读写比决定。如果您的应用程序阅读量很大(子应用程序每小时更改一次,最近性检查为10倍/秒),则计算一次并存储在父表中。如果您的应用程序写得很重(儿童每秒钟更改10次,每小时检查一次最近性),则动态计算,即仅当您需要知道“最近性”时

请注意,由于可以动态确定“最近的子项”,因此将其存储在父表中是多余的。由于非规范化通常只在性能上有很大的提高,除非您阅读量很大,否则我会动态计算。您可以随时在以后重构


我不知道这是否会为您提供一个优雅的解决方案,但它会为您的情况提供“正确”的解决方案,这可以说是一个不错的替代方案。

优雅的解决方案仅基于一个表。根据业务规则编写TSQL以识别“最近的子项”。两个表违反规范化规则并导致添加IO(IMHO)。

优雅的解决方案仅基于一个表。根据业务规则编写TSQL以识别“最近的子项”。两个表违反了规范化规则并导致添加IO(IMHO)。

再好不过了。我会尝试向上投票(希望网站能接受)。谢谢,谢谢。我已经决定在内存中计算,基于在分区上使用行数。做得再好不过了。我会尝试向上投票(希望网站能接受)。谢谢,谢谢。我已决定在内存中根据使用分区上的行数计算..相关:相关: