模型识别一对多关系的前1个孩子

时间:2011-04-28 18:17:30

标签: database-design

是否有任何优雅的数据库模型设计模式用于识别一对多关系中最近的孩子?

给定一个vanilla父/子模型,您可以通过TSQL完成。但是,我想找到一种不需要查看许多行或索引排序的有效方法。

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

父表

-Parent ID

-Top Child ID

儿童表

-Child ID

-Parent ID

有没有人有一个聪明或优雅的解决方案?

2 个答案:

答案 0 :(得分:4)

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

A :事实是根据某些数据库属性确定的(“latest_modified timestamp = most recent”

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

二,随着时间的推移检索这一事实的方式:

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

检索

D :事实是动态计算的

将其分解为暴露了一些(可能不那么明显)的东西:

1) B 在会话中不持久。如果您尝试保留 B ,那么您已将其转换为 A 。另一方面, B 类型解决方案适合于内存缓存技术。如果你不介意“最近的孩子”事实是短暂的,这可能是要走的路。将最新的内容存储在内存中。

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

3)一旦你选择 A ,你必须在 C &的 d 即可。此选择应由预期的读写比率决定。如果您的应用程序被大量读取(子项每小时更改一次,新近度检查为10x /秒),则计算一次并存储在父表中。如果您的应用程序写得很重(孩子每小时更换10次/秒,每小时检查一次),则动态计算,即仅在您需要知道“最新”时才会计算。

请注意,由于可以动态地确定“最近的子节点”,因此将其存储在父表中是多余的。由于非规范化通常仅适用于强大的性能提升,除非你读得很重,否则我会动态计算。你以后总是可以重构。

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

答案 1 :(得分:0)

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