2014-01-07 30 views
0

我有一个非常基本的数据模型:一堆Route s和一堆Location s。 他们有一个多对多的关系需要一个链接表(例如RouteLocation)。存储对象在数据库中的顺序

我遇到了一种方法来存储路径中位置的顺序。我的第一本能是为Route表有一个order列,这个列基本上是一个逗号分隔的字符串,这个路由中的位置的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

这听起来不仅仅是一个Hibernate问题,所以这个问题可能更适合SO。我很确定这可以使用Hibernate解决,但我不是这方面的专家。 –

+0

和查询大概应该是选择位置。*,RouteLocation.order出发地点,RouteLocation WHERE Location.Id = RouteLocation.LocationId ORDER BY RouteLocation.order ASC –

+0

@DocBrown一点点offtopic,但我的初始查询应该是正确的。我只需要与id为1234的路由相关的位置(例如只是一个随机数)。 – j0ntech

回答

3

存储的事情列出来作为一个逗号分隔的字符串总是不好的,由于各种原因(你不能告诉你可能需要多少空间的字符串,遍历列表需要更多的处理工作,每一次,改变它需要更多的努力......)。复制已经存在的外交关系是非常糟糕的,因为您引入了冗余,除了使灾难性的不一致成为可能以外,没有其他用途。而当你存储的东西实际上是外键的时候,坏事会发展到一个全新的水平。事实上,我认为该解决方案只有不足之处,并没有优势。

我不明白你说的问题是与明显的解决方案(使用RouteLocation记录不仅存储在路线停止协会,但他们的顺序),但它不可能比滚动你自己的冗余n:m关系模拟器。如果问题在于Hibernate会将代码需要的数据转换为实现正确行为的数据,那么很显然,它对您而言并不适合您;你应该问一个关于Stackoverflow的实现问题,比如“如何让Hibernate在链接表中存储额外的数据?”。

+0

我认为这将是正确的做法,是的。由于我的数据模型非常简单,我可能根本不使用ORM,只需手动执行映射就不会有太多的工作。 – j0ntech

相关问题