2010-08-10 18 views
2

我正在試驗db4o作爲數據存儲,所以爲了解決這個問題我想我會爲自己構建一個跟蹤web應用程序(在ASP.NET MVC中)的簡單問題。我發現db4o在快速開發方面表現出色,特別是對於像這樣的小應用程序,它也無需ORM。從關係數據庫的背景來看,我應該如何建模db4o(或任何對象數據庫)中的關係?

但是,來自SQL Server/MySQL背景我有點不確定我應該如何構建我的對象,當涉及到關係(或者我只是沒有正確理解對象數據庫的工作方式) 。

下面是我的簡單示例:我只有兩個模型類,Issue和Person。

public class Issue 
{ 
    public string ID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public DateTime? SubmittedOn { get; set; } 
    public DateTime? ResolvedOn { get; set; } 
    public Person AssignedBy { get; set; } 
    public Person AssignedTo { get; set; } 
} 

public class Person 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
} 

ID屬性是由.NET Guid.NewGuid()幫手產生只是GUID的字符串。

所以這裏是我最初以爲應用程序會工作;請忽略任何安全問題等,我們假定我們已經存儲在數據庫中的幾個Person對象:

  1. 在用戶登錄查詢中Person其用戶名和密碼相匹配的數據庫,並存儲他/她的GUID ID作爲會話變量。重定向到應用主屏幕。
  2. 登錄用戶創建一個新的問題單,從下拉列表中選擇要分配給用戶的用戶。他們填寫其他細節(標題,說明等),然後提交表格。
  3. 查詢數據庫中的Person對象(通過它們的GUID ID)以獲取表示登錄用戶的對象和代表已分配權證的用戶的對象。創建一個新的Person對象(填充發布的表單數據),將Person對象分配給Issue對象的AssignedByAssignedTo屬性,並將其存儲。

這將意味着我有兩個Person對象存儲對每個Issue記錄。但是如果我更新原始文件Person,那麼會發生什麼情況 - 在各種問題對象中更新所有存儲的對該Person的引用更新,還是我必須手動處理? 他們引用或複製?

只是爲AssignedBy和AssignedTo字段存儲一個GUID字符串(如下所示),然後每次根據該字符查找原始的人會更好還是更高效?

public class Issue 
{ 
    public string ID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public DateTime? SubmittedOn { get; set; } 
    public DateTime? ResolvedOn { get; set; } 
    public string AssignedByID { get; set; } 
    public string AssignedToID { get; set; } 
} 

我想我只是被困在一種令我困惑的某種思維方式中。如果有人能夠清楚地解釋這將是最有幫助的!

回答

2

對象數據庫嘗試提供與內存中對象相同的語義。經驗法則是:它像內存中的對象一樣工作。對象數據庫存儲數據庫中對象之間的引用。當您更新對象時,該對象將更新。如果您有對該對象的引用,則會看到更改後的版本。

在你的情況下,問題對象引用person對象。當你更新那個人時,引用它的所有問題'看到'更新。

當然,像int,string,longs等原始類型被處理爲值對象而不是引用對象。同樣,數組在db4o中像數值對象一樣處理,這意味着數組與對象一起存儲,而不是作爲參考。其他所有內容都存儲爲參考,甚至包括List或Dictionaries之類的集合。

+0

謝謝,這當然有道理。 – 2010-08-11 14:41:47