database-design - 一维内非重叠范围的数据结构

标签 database-design data-structures normalizing

我需要一个可以在一个维度内存储非重叠范围的数据结构。尺寸的整个范围不必完全覆盖。

一个示例是 session 室调度程序。维度是时间。没有两个时间表可以重叠。 session 室并非总是预定的。换句话说,对于给定的时间,最多可以有一个时间表。

一种快速的解决方案是针对一个范围来存储开始时间和结束时间。

Range {
    Date start
    Date end
}

这是非规范的,需要容器不强制重叠。对于两个相邻的范围,前一个末端将与下一个起始处成为多余。

另一种方案可能涉及在每个范围内存储一个边界值。但是对于连续的范围序列,边界值总是比范围多一个。为了解决这个问题,可以将序列表示为交替的边界值和范围:

B =边界值,r =范围

B-r-B-r-B



数据结构可能类似于:
Boundary {
    Date value
    Range prev
    Range next
}

Range {
    Boundary start
    Boundary end
}

从本质上讲,它是一个具有交替类型的双链表。

最终,无论我使用什么数据结构,都将在内存(应用程序代码)和关系数据库中表示。

我很好奇学术界或行业尝试过的解决方案是否存在。

最佳答案

表示数据的规范化方法是为每个时间单位存储一条记录。这可以在 session 安排应用程序的示例中完成。您的约束将是

(RoomId, StartTime)

在连续范围的情况下,您必须存储2个东西,一个边界,第二个边界或长度。通常是通过存储第二个边界,然后在该两个边界上创建约束来完成的
(boundary not between colBoudaryA and colBoundaryB)

附加的约束是
(startBoundary < endBoundary)

关于database-design - 一维内非重叠范围的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210729/

相关文章:

sql - 对于 PostgreSQL 表来说多大算太大?

mysql - 记录测试结果的数据库设计

c++ - C++中基于链接的堆栈

Python Dictionary DataStructure 哪个方法 d[] 或 d.get()?

schema - 地址簿数据库架构

ruby - 使用 ruby​​ 规范化数据集

mysql - 优化 MySQL 或表设计

mysql - 维护 MySQL 数据库表中元素的顺序或在 MySQL 的特定位置插入新行

algorithm - 如何调整 Fenwick 树以回答范围最小查询