2013-05-15 22 views
0

我有需要在我的Raven數據庫中存儲對實體的任意引用。有時實體是一個聚合根(參見下面的事件),有時候它是一個價值實體(參見下面的會話)。我目前正在計劃將引用存儲爲Lucene查詢(或類似Lucene的語法)。有沒有人做過類似的事情?我正走向一條艱難的道路嗎?如何在RavenDB中存儲對任意實體的引用?

我的一些顧慮是:

  • 價值實體不可能提供標識符,我可以期待可靠的參考價值實體?
  • 單個實體應該不知道(去耦合)任意關係基礎結構,從複雜對象圖推斷查詢的最佳方式是什麼?
  • 將關係限制爲僅聚合根(並阻止對值實體的引用)可以簡化問題,但這需要我重新構建事件/會話文檔。我希望這兩個系統保持分離(關注一個不應該影響另一個)。

我已經在下面包含示例文檔來說明我的方案。任何想法,想法,指導或例子將非常感激。

Events Collection 
{ 
    Id: 「30f6...54a7」, 
    Title: 「Annual Meeting」 
    Sessions: [ 
    { 
     Code: 「COM001」, 
     Title: 「Opening Ceremony」 
    }, 
    { 
     Code: 「TEC201」, 
     Title: 「Intermediate Tech」 
    } 
    ] 
} 

People Collection 
{ 
    Id: "45a8...f209", 
    Name: "Chad" 
} 

Arbitrary Relationships Collection 
{ 
    Id: 「b613...8ebb」, 
    SubjectEntityQuery: "People.Id:45a8...f209", 
    TargetEntityQuery: 「Events.Id:30f6...54a7.Sessions,Code:COM001」, 
    Action: "Attended Session", 
    Story: "Chad attended the Opening Ceremony session" 
} 

編輯

我想給上的任意關係的更多細節。我們將有能力擴展系統以響應系統事件並記錄兩個實體之間的交互。我們擁有比事件,會話和人員更多的實體。這種關係可能是一個人共享一個關於哈希標籤的鏈接或推文。實際上,Arbitrary Relationships集合變成了一個類似圖形的結構,它允許我們看到給定實體的所有交互。

回答

2

這是尖銳的關係設計。

最簡單的方法是使關係成爲一個對象,它的主題和目標字段是一個字符串數組,它包含它引用的實際文檔的ID。這樣,您可以利用Includes將它們與關係文檔一起加載。無論如何,我看不出如何在這裏存儲Lucene查詢語法。

對此進行建模可能有更好的方法,但這取決於您的業務模型和您試圖實現的目標。

此外,您可能想要擺脫GUID ID,只需使用Raven的約定即可。

+0

我可能會也可能不會實際執行鍼對Raven的Lucene查詢。我希望Lucene語法購買的是能夠將DocumentId(用於聚合根)和價值實體的路徑存儲在單個值中。我喜歡你的建議使用包含。 Re:這種尖銳的關係設計 - 你可能是正確的,但是這個解決方案的核心領域(事件/會話)很好地適合面向文檔的範例。感覺關係型是需要任意實體之間的跟蹤關係的獨立關注。我會更新問題以提供更多詳細信息。 – CodeChef

相關問題