在我的数据库中实现等待列表哪种方式更好?

时间:2011-05-06 09:04:59

标签: database-design priority-queue

假设我有一个USER表,我的每个数据库都要处理某种等待列表。等待列表类似于优先级队列(它不是FIFO,有一个值将决定队列位置)。我想有另一个表WAITINGLIST,包含两列,代表用户ID(外键)和用户在等待列表中的优先级。这是一个很好的设计吗?每当有空缺时,优先级最高的用户将被提供并从WAITINGLIST中删除。

叫什么关系?它是一对一的吗?但并非所有用户都存在于WAITINGLIST中。

这是一个好的设计吗?我读到一对一很少是好的设计。我也可以将此优先级值作为USER中的另一列,但由于USER比WAITINGLIST大得多,我想通过使用WAITINGLIST(排序的行数要少得多)可以提高性能。

编辑:优先级不是一些有限的离散值,如(0 - 5,低 - 高),但它是一个浮点值(某些计算的结果),并且对于同一个用户来说非常罕见具有相同的优先级,所以这里的问题不在于选择两个用户具有相同的优先级。

3 个答案:

答案 0 :(得分:1)

拥有WAITING_LIST表并不一定是糟糕的设计。如果您需要知道的关于等待名单位置的唯一事情是得分(和用户ID),那么它是有争议的。如果您可能想要其他与等待列表相关的内容,例如添加记录的日期和时间,是否存在某些临时状态信息,例如代码说“等待评估”或类似内容,则a 1:1的关系是完全可以接受的数据库设计。

你必须小心使用经验法则。说1:1关系是一个糟糕的设计的经验法则是基于这样一个事实,即许多人不知道何时以及如何正确使用它们。当您处理子类型时,1:1完全可以。

在您的情况下,WAITING_LIST表是工作列表。工作清单本身很有意义,因此可以将其建模为自己的表格。如果你在这个表中只有一个属性(优先级得分),那么对表的需求很弱,但是无论如何都要使用表也不错,特别是如果以后可能会添加其他属性的任何实质性风险,或者如果您可以更改为不删除工作清单但是为了历史目的而跟踪的模式,在这种情况下,关系可能变为1:多。

答案 1 :(得分:0)

那么WAITINGLISt表中第三列存储插入行时的时间戳呢?

如果2行具有相同的优先级,则可以按优先级和时间戳排序。

答案 2 :(得分:0)

如果在Oracle中工作,USER.QUEUE_POSITION的索引会非常小,因为没有排队等候服务的用户将具有USER.QUEUE_POSITION的NULL值,因此不会在索引中。