2014-01-07 54 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

相關問題