存储数据库中对象的顺序

时间:2014-01-07 08:33:10

标签: database-design hibernate

我有一个非常基本的数据模型:一堆Route和一堆Location。 他们有多对多关系,需要链接表(例如RouteLocation)。

我遇到了一种方法来存储路线中位置的顺序。我的第一直觉是order表的Route列,它基本上是该路​​线中位置ID的逗号分隔字符串,当然是有序的。这意味着我必须在webapp中进行排序(解析字符串,比较ID等)。我宁愿用数据库系统完成它(例如ORDER BY)。

我可以在RouteLocation表中的路线中存储位置的索引,然后我可以有SELECT *, RouteLocation.order FROM Location, RouteLocation WHERE Location.id IN (SELECT RouteLocation.locationId FROM RouteLocation WHERE RouteLocation.routeId = 1234) ORDER BY RouteLocation.order ASC;之类的查询。我使用这种方法的问题是我正在使用Hibernate框架,它只是抽象链接表。查询类似于(我忘记了确切的Hibernate SQL方言)SELECT loc from Location loc WHERE loc.route = :route

1 个答案:

答案 0 :(得分:3)

以逗号分隔的字符串存储事物列表总是很糟糕,原因各种各样(你无法确定字符串可能需要多少空间,迭代列表每次都需要更多的处理工作,更改它需要付出更多努力...)。复制已经存在的外来关系是非常糟糕的,因为你引入了冗余,除了使灾难性的不一致成为可能之外没有任何意义。当你存储的东西实际上是外键时,坏处会呈现出一个全新的水平。事实上,我认为该解决方案只有缺点,没有优势。

我不明白你说的问题是明显的解决方案(使用RouteLocation记录不仅存储路线中的停靠点的关联,而且还存储它们的顺序),但它不可能比滚动你自己的冗余n:m关系模拟器更糟糕。如果问题是Hibernate转换了代码需要实现正确行为的数据,那么很明显它对你起作用而不是对你不利;你应该在Stackoverflow上问一个实现问题,比如“如何让Hibernate在链接表中存储额外的数据?”。